今天跟人討論幾個字符串的問題,其中之一就是strcpy函數的實現。關鍵代碼就是while((*strDest++=*strSrc++)!='\0'),發現了三個小問題,分析以下。c++
1能不能改爲while(*strDest++=*strSrc++)?ide
能夠的,在vs2010下運行沒有問題。由於'\0'能當false用。輸入代碼:函數
if('\0')spa
printf("hehe");調試
單獨編譯運行這兩行代碼是沒有任何輸出的。字符串
2(*strDest++=*strSrc++)!='\0'到底是用誰的值來和'\0'比較?it
char a[20];編譯
char *str=a;class
char *src=\"abcd\";程序
printf("%c\n",*str++=*src++);
輸出的結果是字符a
*strDest++=*strSrc++整個表達式的值是‘a’。因此(*strDest++=*strSrc++)!='\0'是判斷前面賦值表達式的值是否爲'\0'。既不是*strDest,也不是*strSrc。
單獨調試以下代碼:
int a,b=2;
printf("%d\n",a=b);
輸出結果爲2。若是b不賦值,程序運行錯誤。
3 char *strDest;能直接用嗎?
固然不能。
char *str;
char *src=\"abcd\";
strcpy(str,src);
printf("%s\n",str);
以上代碼編譯有警告,運行會出錯。
若是改爲
char *str="";
char *src=\"abcd\";
strcpy(str,src);
printf("%s\n",str);
運行也會出錯。
解決方法是
char a[20];
char *str=a;
char *src=\"abcd\";
strcpy(str,src);
printf("%s\n",str);
這樣程序能完美運行,輸出結果abcd。