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