小明最近寫程序發現經常會出現一些莫名其妙的錯誤, 就過來問大明,說程序總是出現問題的,而且莫名其妙的就掛在了strcpy這裡了, 郁悶了挺久的了,於是剛畢業不久的小明還是不太好意思的來問了大明, 大明看了小明的代碼,發現了一些問題,這些問題是平時寫程序不太注意時經常發生的哦, 現在就展開來讓大家一起看看 [cpp] #include <stdio.h> /* * 注意所犯錯誤1 */ void error1() { char str0[10]; char *str1 = "0123456789"; strcpy(str0, *str1); } /* *注意所犯錯誤2 */ void error2() { char str0[10]; char str1[10]; int i = 0; for(i=0; i<10; i++) { str1[i] = 'a'; } strcpy(str0, str1); } /* *注意所犯錯誤3 */ void error3(char *str1) { char str0[10]; int len = strlen(str1); if(len <= 10) strcpy(str0, str1); } void main() { error1(); error2(); error3("001123456789");/*注意*/ } 下面是對以上所犯錯誤做修正: [cpp] /* * 注意所犯錯誤1修正 */ void right1() { char str0[11] = {0}; char *str1 = "0123456789"; strcpy(str0, str1); } /* *注意所犯錯誤2修正 */ void right2() { char str0[11] = {0}; char str1[11] = {0}; int i = 0; for(i=0; i<10; i++) { str1[i] = 'a'; } strcpy(str0, str1); } /* *注意所犯錯誤3修正 */ void right3(char *str1) { char str0[10] = {0}; int len = strlen(str1); if(len < 10) strcpy(str0, str1); } void main() { right1(); right2(); right3("001123456789");/*注意*/ } 請寫出strcpy()原型設計代碼: 比較常見的犯錯應該像下面代碼了, [cpp] /*請寫出strcpy()函數原型*/ /* *注意1 */ void strcpy(char *dest, char *source) { while(*source != '\0') *dest++ = *source++; } /* * 注意2 加上const,防止參數被改變 */ void strcpy(char *dest, const char *source) { while(*source != '\0') *dest++ = *source++; } /* * 好的strcpy應該如下 */ void strcpy(char *dest, const char *source) { assert((dest != NULL) && (source != NULL)); const char *temp_src = source; char *temp_dest = dest;//防止過程中改變dest的地址 while(*temp_src != '\0') *temp_dest++ = *temp_src++; }