今天,我介绍一下如何模拟实现strcat,strcpy , strcmp以及strstr
1,模拟实现strcat:
思路:为了将src的内容追加到dest的后面,首先让指针*dest++,直到遇到‘\0’;然后再将src的内容追加上去。由于在整个执行完之后,dest已经指向了字符串的末尾,所以在刚开始,将dest的值给ret,最后返回ret,即可得到修改后的字符串。代码如下:
char *mystrcat(char *dest,const char *src)
{
char *ret =dest;
assert(dest != NULL);
assert(src != NULL);
while(*dest)
{
dest++;
}
while((*dest++ = *src++))
{
;
}
return ret;
}
int main()
{
char arr[10] = "hello";
printf("%s ", mystrcat(arr, " world"));
return 0;
}
2,
模拟实现strcpy:
思路:由于传参传的是首元素地址,所以用指针变量来接受,而且在使用指针变量时注意判空,即:assert。然后对src的内容一个一个进行拷贝,直到遇到‘\0’,dest停止拷贝。代码如下:
char *mystrcpy(char *dest,const char *src)
{
char *ret =dest;
assert(dest != NULL);
assert(src != NULL);
while((*dest++ = *src++))
{
;
}
return ret;
}
int main()
{
char arr[10] = "";
printf("%s ", mystrcpy(arr, "Hello"));
return 0;
}
3,
模拟实现strcmp:
思路:由于这里的两个字符串只是进行比较,而不需要进行修改,所以可以加上const进行修饰。其次,在进行字符串比较的时候,比较的是相同位置的ASCII码,而不是看哪个字符串长。
在字符串进行比较的时候若str1=str2,则返回零;若str1< str2,则返回负数;若str1>str2,则返回正数。两个字符串进行一一比较时,如果两个字符串不一样,直接相减,当两个字符串相等时,直接输出0。代码如下:
int my_strcmp(const char *str1, const char *str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
while(*str1 == *str2)
{
if(*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return *str1-*str2;
}
int main()
{
char *p1 = "abcdef";
char *p2 = "abchd";
int ret = my_strcmp(p1,p2);
printf("%d ", ret);
return 0;
}
4,模拟实现strstr:
思路:首先,要明白strstr的功能,给上两个字符数组:str1[20]="abcdefg",str2[10]="bcd";通过使用strstr得到的结果是”bcdefg“。其次,在进行查找的时候,s1是在向前走的,因此需要一个指针cur,只有当cur走到’\0’的时候,才算整个字符串查找完毕。需要注意的是,每次查找中,需要判断*str1 != '\0' *str2 != '\0' ,然后判断 *str1 == *str2,顺序不能颠倒,即先判断是否遇到’\0’,再判断是否相等。
char * my_strstr(const char *str1, const char *str2)
{
const char *cur = str1;
const char *s1 = str1;
const char *s2 = str2;
assert(str1 != NULL);
assert(str2 != NULL);
while(*cur != '0')
{
str1 = cur;
str2 = s2;
while((*str1 != '\0') && (*str2 != '\0') && (*str1 == *str2))
{
str1++;
str2++;
}
if(*str2 == '\0')
{
return (char* )cur;
}
cur++;
}
return NULL;
}
int main()
{
char *p1 = "abcdefg";
char *p2 = "bcdef";
printf("%s\n", my_strstr(p1, p2));
return 0;
}