先看代码如下代码:
#include<stdio.h> /*for 与while循环实现*/ char* strcat1(char* to ,char* from) { char* save = to; for(;*save;save++); while((*save++ = *from++)!= '\0'); // return save; //修改前 return to; } /*for循环实现*/ char* strcat(char* to ,char* from) { char* save = to; for(;*save;save++); for(;(*save = *from) != '\0';save++,from++); // return save;//修改前 return to; } /*while循环实现*/ char* strcat2(char* to ,char* from) { char *save = to; while(*save) save++; while((*save++ = *from++ ) != '\0'); // return save;//修改前 return to; } int main() { char c[20] = {0}; // char c[20]; char *p = "Hello,world!" ; strcat2(c,p); printf("%s\n",c); return 0; }
测试代码中有char c[20]= {0} ;与 2、char c[20] ;
若写成char c[20]= {0}则可以完整输出Hello,world!,但若是char c[20]则输出中有乱码,
这是为什么?
2、while循环实现中while(*save) save++;能否改成while(*save++)?;
跟进:
问题三:对比标准的strcat函数,
char * strcat(char *s, const char *append) { char *save = s; for (; *s; ++s); while ((*s++ = *append++) != '\0'); return(save); }
发现自己之前仿写的函数中的问题有?
1、函数返回值问题?
之前仿写时根本没考虑这么多,导致出现这么萌的错误。对于函数,我们关注它什么:函数功能,参数,返回值,不就是这三点吗,说时简单,自己写代码时就没管这么多了。羞愧啊!
这个函数功能是实现字符串的拼接,为什么还需要返回指向首地址的指针呢?想了想没结果,只好找google,原来是为了实现链式操作,例如:strcpy(s,strcat(s1,s2));
2、书写*问题,即char * strcat与char* strcat所反应出来的问题?
花姐说得关于定义指针变量的三种书写格式:
(1) char * a;
(2) char *a;
(3) char* a;
第一种是他自己用的方式,第二种在很多开源项目中常用到,第三种是他最鄙视的用法,而我恰恰用了第三种。果断被鄙视了一把。
char * a;三步法解释这个语句:
1、首先在内存中申请四个字节用以存放变量a;
2、定义一个指针变量a,
3、指针指向的数据类型为char型,这决定了指针每次偏移的位数。