找錯Void test1(){char string[10];char* str1="0123456789";strcpy(string, str1);}
答:string 大小不夠 str1末尾還有一個'/0'Void test2(){char string[10], str1[10];for(I=0; I<10;I++){str1[i] ='a';}strcpy(string, str1);}
答:字符串沒有加’/0’,雖然兩個字符數(shù)組一樣的大,但是沒有考慮字符串后面的‘/0,’導(dǎo)致程序出錯
Void test3(char* str1){char string[10];if(strlen(str1)<=10){strcpy(string, str1);}}
答:對試題3,if(strlen(str1) <= 10) 應(yīng)改為if(strlen(str1) < 10),因為strlen的結(jié)果未統(tǒng)計'/0'所占用的1個字節(jié)。
當(dāng)沒有給字符串留'/0'的位置時候會出現(xiàn)的奇怪錯誤
int m;
char n[6];
scanf("%d|",&m);
PRintf("%d/n",m);
scanf("%[0-9]|",n);
printf("%d %s",m,n);
以上代碼當(dāng)輸入 1|600000|時候會輸出
1
0 600000
你會發(fā)現(xiàn)第一個參數(shù)的值變了。這是為什么么呢?當(dāng)將第二個參數(shù)如下聲明就會錯誤消失
char n[7]; (PS必須留一個位置給'/0'要不然會出現(xiàn)奇怪的錯誤)
我的理解是'/0'不夠造成的內(nèi)存溢出,而這兩個內(nèi)存單元正好是連續(xù)的。'/0'賦值到了m上和'/0'的ASCLL碼值剛好是0;
因此我們來做一個實驗,我們用最開始的那段代碼,即n只有6個內(nèi)存單元
這時候我們輸入 1|6000001|時候會輸出
1
49 6000001
可以發(fā)現(xiàn)第一個參數(shù)的值變成了49;這恰好是ASCLL碼上1的值;這當(dāng)然不是巧合。你可以試試別的參數(shù)。當(dāng)然如果你的第二個參數(shù)輸個10位長度那么這會更加明顯。
這也就是為什么我們公司要寫那么多宏定義像如下一樣的,在定義時就預(yù)留了'/0'的位置。就是為了防止我的小白的錯誤。
typedef char n[7];
剖析:考查對基本功的掌握:(1)字符串以'/0'結(jié)尾;(2)對數(shù)組越界把握的敏感度;(3)庫函數(shù)strcpy的工作方式
新聞熱點
疑難解答