目录
1.strcpy函数
1.1简介strcpy函数
根据官网上的介绍,strcpy函数有2个参数,第一个参数是destnation(意思是字符串的粘贴地),第二个参数是source(意思是字符串的复制地)。
这个函数有几个注意事项:
1.源字符串必须以‘\0’结尾。 2.strcpy函数会将‘\0’拷贝到目标空间。 3.目标空间必须可修改而且要足够大。
1.2strcpy函数的使用和模拟实现
1.2.1strcpy函数使用:
int main()
{
char arr1[] = "**********";
char arr2[] = "abcd";
printf("%s\n", strcpy(arr1, arr2));
return 0;
}
输出结果是:
我们发现arr1中的后面的x并没有被打印出来,说明strcpy函数会将源字符串的'\0'也复制到目标字符串中,以达到覆盖的效果。
1.2.2strcpy函数的模拟实现
字符串函数返回的值都是char*类型的地址。再根据strcpy函数的两个参数可以对该函数进行下列模拟:
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while ((*dest++ = *src++))
{
;
}
return ret;
}
int main()
{
char arr1[] = "**********";
char arr2[] = "abcd";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
2.strcat函数
2.1strcat函数简介
strcat函数(string concatenation function)作用是将源字符串的内容转移到目标字符串的后面。这种方式不会破坏目标字符串,相当于只给目标字符串添加了一个源字符串。
strcat函数注意事项:
1.源字符串必须以'\0'结尾。 2.目标字符串也必须有'\0',要不然不知道从哪个位置开始追加。 3.目标字符串必须要有足够空间,并且可修改。
2.2strcat函数的使用和模拟实现
2.2.1strcat函数的使用
像之前所说,strcat是在目标字符串后面追加源字符串,所以不会像strcpy函数那样起到覆盖的效果,代码如下:
int main()
{
char arr1[] = "abcdef";
char arr2[] = "xxxxxx";
printf("%s\n",strcat(arr2,arr1));
return 0;
}
输出结果是:
2.2.2strcat函数的模拟实现
char* my_strcat(char*dest,const char*src)
{
assert(dest != NULL);
assert(src != NULL);
char* ret = dest;
while (*dest)
{
dest++;
}
dest++;
while ((*dest++=*src++))
{
;
}
return ret;
}
int main()
{
char arr1[] = "abcdef";
char arr2[100] = "xxxxxx";
printf("%s\n",strcat(arr2,arr1));
printf("%s\n", my_strcat(arr2, arr1));
return 0;
}
模拟实现大致与strcpy函数相似,只是在复制粘贴工作之前增加了一个找目标字符串'\0'的工作(这样才能保证追加在源字符串的后面)。
模拟strcat函数和strcat函数效果对比结果如下:
3.strcmp函数
3.1简介strcmp函数
strcmp函数是比较两个字符串的函数,根据cplusplus官网上的信息,strcmp函数有两个参数(两个参数都是const char*类型的,将字符串的首元素地址传参过去),返回的是一个整型值。
当左边的字符串小于右边字符串时,返回值是负数。 当左边的字符串等于右边字符串时,返回值是0。 当左边的字符串大于右边字符串时,返回值是正数。
3.2strcmp函数使用及原理和模拟实现
3.2.1strcmp函数的使用及原理
字符串大小比较的原理是:从字符串第一个元素开始比较,如果正在比较的元素的Asc||码值相同就进入下一个元素的比较;如果正在比较的元素的码值不同,则停止比较,Asc||码值大的元素对应的字符串就更大。
比如:"abcdefg"<"abcq"
我们写代码来验证一下:
除了比大小之外,strcmp函数还能判断输入的字符串是不是你想要的字符串以此来达到一定的效果。比如:如果输入 "Jay Chou",就输出"好帅";而输入其他字符串则无效,可以用下面这段代码来进行:
int main()
{
while (1)
{
char c[] = "0";
printf("请输入字符串:");
gets(c);
if (strcmp(c, "Jay Chou") == 0)
{
printf("好帅\n");
}
else
{
;
}
}
return 0;
}
用strcmp比较,当输出结果为0,就说明两个字符串完全一致。
3.2.2strcmp函数的模拟实现
根据前面介绍的strcmp函数比较的原理,我们大致知道了这个函数是逐字符进行比较的。所以我们可以写出以下代码来:
int my_strcmp(const char*str1,const char*str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
然后我们在主函数中进行测试:
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdef";
int ret1 = strcmp(arr1,arr2);
int ret2 = my_strcmp(arr1, arr2);
printf("%d\n",ret1);
printf("%d\n",ret2);
return 0;
}
测试结果如下:
因为函数返回值只对正负有要求,所以我们很好地完成了模拟任务。
4.strstr函数
4.1简介strstr函数
4.2strstr函数使用及原理和模拟实现
4.2.1strstr函数的使用
先看下面这一段代码:
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "cde";
char*ret= strstr(arr1, arr2);
printf("%s\n",ret);
return 0;
}
打印结果是:
更加印证了strstr函数的作用是找到目标字符串在源字符串中的位置,并从该位置继续向后打印直到遇见'\0'为止。
如果在源字符串中找不到目标字符串,那么系统将会返回一个(NULL)指针。
4.2.2ststr函数的模拟实现
模拟实现的本质在于:通过指针比较目标字符串是否在源字符串中出现过,那么我们使用的就是地址的解引用。
我们先假设有这样两个字符串:arr1="abbbcdef" , arr2="bbc". 按照我们原有的思路,先移动arr1的指针直到与arr2的首字符相等的时候开始匹配。但是,当arr1,arr2的指针同时移动:arr1指针从第一个b开始移动到到第三个b,arr2的指针到c的时候发现并不匹配,这个时候按理说不能直接判断为匹配失败,而是要让arr1的指针从第二个b开始,arr2的指针从第一个b开始进行下一轮的匹配,但是此时两个指针都不在原有的位置上了,这是解决此问题的一个最大的麻烦。
如下图:
左图是起始位置在abbbcdefg 的检测过程,右图是左边检测失败后应当进行的从abbbcdefg 开始的检测过程。而因为指针位置错乱了所以导致在常规思路下检测无法正常进行。
所以要想正常地进行检测,除了str1和str2以外,我们必须要有一个专门的指针记录源字符串开始匹配的位置,还要有一个移动指针指向arr2,当需要重新检测的时候再用str2赋值即可。
完整代码如下:
char* my_strstr(const char*str1,const char*str2)
{
char* s1 = NULL;
char* s2 = NULL;
char* current = str1;
while (*current)
{
s1 = current;
s2 = str2;
while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0')
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return current;
}
current++;
}
return NULL;
}
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "cde";
char*ret1= strstr(arr1, arr2);
char* ret2 = my_strstr(arr1,arr2);
printf("%s\n",ret1);
printf("%s\n", ret2);
return 0;
}
两种函数输出结果比较为:
感谢观看,有任何错误请批评指出