先看代碼如下代碼:
#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型,這決定了指針每次偏移的位數。