先看代码如下代码:

#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++)?;




跟进:


问题一:
char c[20];定义了一个长度为20的char型数组c,但是并没有对其进行清零操作,也就是说c[0]的值并不一定为 '\0',这个可以通过打印其值可以得到验证。
由此可知为啥定义数组和结构体等数据结构变量时需要对其先进行清零操作后再使用,否则有可能会出现莫名的异常问题。
对于数组清零方式有:
1、如char c[20]={0};
2、使用系统清零函数:memset(c,'\0',20);
问题二:
while循环实现中while(*save) save++;能否改成while(*save++)?;
这个很明显不可以,后者不管*save的值是否为'\0',指针都会偏移,指向下一个地址。

问题三:对比标准的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型,这决定了指针每次偏移的位数。