在研究strcat函数实现的时候,发现了while(*p++ !=‘\0’)的大秘密,也让我发现了在上篇博客中我犯的一个错误。原以为跳出后,P指向'\0',而实际上并非如此!我按跳出后P指向'\0',结果怎么拼接都实现不了,NND。为了验证这个问题,我们先上个小程序吧:
#include<stdio.h>
void main()
{
char *p = "abcdefg";
while(*p++ != 'c');
printf("%c\n", *p);
}
您猜打印出来的是几? 结果是d。
为什么呢?
原来*和++的优先级是一样的,当优先级一样的时候,程序按自左至右的顺序执行。所以当*p = 'c' 或者*p = '\0'时,p仍然要往下移一位, 即p指向满足条件后的下一个字节。
由于'\0' 结束符,if 、while当会把他判成0,因此程序写成while(*p++ );效果也一样,最终程序指向字符串结束符'\0'的下一字节。
如果这样写:
while(*p)
p++;
当*p='\0'时,进不到while里面的循环,因此这种写法跳出循环的时候,p指向的是'\0'。同志们注意了,这样写while后面是没有“;”号的,文章一开始的写法后面是有“;”号的。
所以明白了这,我们写strcat就好些了,首先查找目的字符串dst的末尾处,然后复制过去就OK了。
#include <stdio.h>
#include <assert.h>
char *strcat(char *dst, const char *src)
{
assert(dst);
char *dstFirst = dst;
while(*dst++);
dst--;
while(*dst++ = *src++);
return dstFirst;
}
//测试部分
void main()
{
char *str1 = "you must";
char *str2 = "zijuezizhi!";
char *dst = malloc(100);
strcat(strcat(dst, str1), str2);
prinf("%s\n", dst);
free(dst);
dst = NULL; 这个为什么大家指点
}
测试结果:you mustzijuezizhi! 一切正常。
char *dst = malloc(100); 这句话也可以这样写:char *dst = NULL; dst = (char *)malloc(100);在程序结束处一定要free(dst)啊!也有书上说在dst调用strcat之前,要*dst = '\0',我没这样,测试结果也正确。水平有限,有些问题解释不了,大神看到了指点一二。
这里交代下为甚strcat包括strcpy函数要返回char*类型,通过程序也看到了,返回的是首地址。我们printf打印一个字符串用的参数 就是首地址。因此通过返回首地址可以实现像 strcat(strcat(dst, str1), str2);这种 链式调用 。在某些场合很方便。
字符串拼接函数strcat的实现 while(*p++ !='\0')跳出后,p究竟指向哪? C/C++求职面试必备考点(三)