一、頭文件:String.h
#ifdef __STRING_H__
#define __STRING_H__
#endif
char *my_strcpy(char*arr,const char*arr1);//字符串複製
char *my_strcat(char*arr,const char*arr1);//字符串拼接
char *my_strstr(const char*arr,const char*arr1);//子串查找,有返回查找的字串到結束
const char *my_strchr(const char*arr,const char arr1);//字符查找,有返回此字符地址,無返回NULL
int my_strcmp(const char*arr,const char*arr1);//字符串比較
char *my_memcpy(void *arr,void *arr1,int count);//字符串複製,內存複製
char *my_memmove(void *arr,void *arr1,int count);//字符串複製,內存複製,避免內存重疊
二、實現函數:String.c
#include<stdio.h>
#include<assert.h>
char *my_strcpy(char*arr,const char*arr1)//字符串複製
{
char *str=arr;//返回地址,便於鏈式反應
assert(arr);
assert(arr1);
while(*arr++ = *arr1++);//將'\0'也要複製
return str;
}
char *my_strcat(char*arr,const char*arr1)//字符串拼接
{
char *str=arr;
assert(arr);
assert(arr1);
while(*arr++);
arr--;//跳出上一個循環時,已指向'\0'的下一個地址
while(*arr++ = *arr1++);//覆蓋掉原有'\0',將arr1全接在arr後
return str;
}
char *my_strstr( char*arr,const char*arr1)//子串查找
{
assert(arr);
assert(arr1);
if(*arr1=='\0')//arr1只有一個'\0','\0'不比較
return NULL;
while(*arr)
{
//q從第一個字符開始比較,連續相同至'\0'則找到,否則q重新開始,p從當前位置繼續比較
const char *p=arr;//保存當前arr的位置
const char *q=arr1;//arr1從第一個字符開始
while(*q)
{
if(*p&&*p==*q)//判斷是否相同,且不爲'\0'
{
q++;
p++;
}
else//不同退出q重新開始,或結束
break;
}
if(*q=='\0')//找到結束
{
return arr;
}
else//未結束,arr進行下個字符比較,arr1重新開始
arr++;
}//遍歷至arr的'\0'則未找到
return NULL;
}
int my_strcmp(const char*arr,const char*arr1)//字符串比較
{
assert(arr);
assert(arr);
while(*arr&&arr1)//都不爲'\0'
{
if(*arr>*arr1)
return 1;
else if(*arr<*arr1)
{
return -1;
}
arr++;arr1++;
}
if(*arr==0 && *arr1==0)//都比較結束,相等
return 0;
if(*arr)//arr長則大
return 1;
else //否則小
return -1;
}
const char* my_strchr(const char*arr, const char arr1)//字符查找
{
assert(arr);
assert(arr1);
while(*arr){
if(*arr == arr1)
return arr;
arr++;
}
return NULL;
}
char *my_memcpy(void *arr,void *arr1,int count)//字符串複製,內存複製
{
void* str = arr;//保留起始地址
assert(arr);
assert(arr1);
while(count--)
{
*(char*)arr = *(char*)arr1;
arr=(char*)arr+1;
arr1=(char*)arr1+1;
}//跳出時指向複製字符串的下一個字符
return (char*)str;//輸出複製後的結果
}
char *my_memmove(void *arr,void *arr1,int count)//字符串複製,內存複製,避免內存重疊
{
void *str=arr;
assert(arr);
assert(arr1);
if(arr<=arr1||(char*)arr>=((char*)arr1+count))//arr在arr1之前或arr在arr1+count之後,直接複製
{
while(count--)
{
*(char*)arr=*(char*)arr1;
arr=(char*)arr+1;
arr1=(char*)arr1+1;
}
}
else//後往前複製,有內存重疊
{
arr=(char*)+count;
arr1=(char*)+count;
while(count--)
{
*(char*)arr=*(char*)arr1;
arr=(char*)arr-1;
arr1=(char*)arr1-1;
}
}
return (char*)str;
}
三、使用函數:main.c
#include<stdio.h>
#include<stdlib.h>
#include"String.h"
int main()
{
char arr[20]="abc123";
char arr1[]="456def";
//my_strcpy(arr,arr1);
printf("%s \n",arr);
my_strcat(arr,arr1);
printf("%s \n",arr);
printf("%s \n",my_strstr(arr,"56"));
printf("%d \n",my_strcmp(arr,arr1));
printf("%s\n",arr);
printf("%p \n",strchr(arr,'2'));
printf("%p \n",my_strchr(arr,'2'));
printf("%s\n",arr);
printf("%s\n", my_memcpy(arr, "987", 4));
printf("%s \n",my_memmove(arr,"456",3));
system("pause");
return 0;
}