用my_strcpy、my_strcat、my_strcmp、my_strstr这四个函数来分别模拟实现库函数strcpy、strcat、strcmp、strstr。
1.strcpy
strcpy(dest,src)函数是把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间中,而且src和dest所指内存区域不可以重叠。这就要求dest必须有足够的空间来容纳src的字符串。
思路:对src字符串一个一个进行拷贝,当遇到NULL时,dest停止拷贝。
char* my_strcpy(char *dest,const char *src)
{
char *cp=dest;
assert(src && dest);
while(*dest++=*src++)
{
;
}
return cp;
}
int main()
{
char arr[80]={0};
printf("string=%s\n",my_strcpy(arr,"hello world"));
return 0;
}
结果:hello world
2.strcat
strcat(dest,src)是把src所指字符串添加到dest结尾处(覆盖dest结尾处的‘\0’),src和dest所指内存区域不可以重叠,所以dest必须有足够的空间来容纳。最后结果返回的是指向dest的指针。
思路:先将dest最后一个字符的地址记录下来,然后将src拷贝,即追加上去。
char* my_strcat(char* dest,char* src)
{
char *cp=dest;
assert(src && dest);
while(*dest!='\0')
{
dest++;
}
while(*dest++=*src++)
{
;
}
return cp;
}
int main()
{
char arr1[15]="abcd";
char *arr2="ef";
printf("%s\n",my_strcat(arr1,arr2));
return 0;
}
结果:abcdef
3.strcmp
strcmp(str1,str2)是用来比较两个字符串的,设这两个字符串为str1,str2,若str1=str2,则返回零;若str1 < str2,则返回负数;若str1>str2,则返回正数。例如:abcd>abcc。
思路:把两个字符串一个一个进行比较,当两个字符串不一样时,直接减,当两个字符串相等时,直接输出0。
int my_strcmp(char* arr1,char* arr2)
{
assert(arr1 && arr2)
while(*arr1==*arr2)
{
if(*arr1=='\0')
return 0;
}
return *arr1-*arr2;
}
int main()
{
char *arr1="abcde";
char *arr2="abcd";
int ret=my_strcmp(arr1,arr2);
printf("%d\n",ret);
}
结果:101
4.strstr
函数的定义:char* my_strstr(const char* dest,const char*src){}。其中,dest指向的是目标字符串,也就是你需要比较的字符串,src指向的是源字符串,也就是用来被比较的字符串。找不到就可以返回一个空指针。
思路:可以建立两个指针,通过遍历的方式逐个访问字符串,并对这两个指针一一比较。
char *my_strstr(char *s1,const char*s2)
{
int n;
printf("%x\n",s1);
if(*s2)
{
while(*s1)
{
for(n=0;*(s1+n)==*(s2+n);n++)
{
if(!*(s2+n+1))
return(char*)s1;
}
s1++;
}
return NULL;
}
else
printf("LLHH!\n");
return (char*)s1;
}
//test
void main()
{
char aa[20]="aabb";
char *bb="bb";
char *cc;
cc=my_strstr(aa,bb);
printf("%x\n",cc);
}