首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

字符串拼凑函数strcat的实现 while(*p++ !='\0')跳出后,p究竟指向哪? C/C++求职面试必备考点(三)

2012-08-28 
字符串拼接函数strcat的实现 while(*p++ !\0)跳出后,p究竟指向哪?C/C++求职面试必备考点(三)在研究strcat

字符串拼接函数strcat的实现 while(*p++ !='\0')跳出后,p究竟指向哪? C/C++求职面试必备考点(三)

    在研究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; 这个为什么大家指点字符串拼凑函数strcat的实现 while(*p++ !='\0')跳出后,p究竟指向哪?  C/C++求职面试必备考点(三)

}

测试结果: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);这种链式调用。在某些场合很方便。





2楼yanzi1225627昨天 09:52
嗯 哈哈 就是说释放的是所指的地址,然后dst=NULL,是让他本身释放掉
1楼helinlin007昨天 09:35
师兄,我倒是知道点关于NULL,指向空的也不一定是指向一个随机的地址值,例如在MFC中,就有一个固定分配的值来表示NULL。但是如果不用dst=NULL的话,就会出现指针乱指的现象!虽然他已经释放了,但是只是释放掉所指的地址,指针本身为释放掉吧!

热点排行