如題,我的程式碼在Dev C++上Pass後,送到了系統測試出現 緩衝區溢位 的問題。
下方為主程式:
int main(void){
string str;
char input[10]; <= Buffer Overflow error 發生在這行。
int sum,i;
while(cin>>str){
strcpy(input, str.c_str());
sum= LetterToNum(input[0]); //額外寫一個"LetterToNum"的Function,把第一個英文字母的數字算出來
for(i=1;i<9;i++)
sum+= CharToInt(input[i])*(9-i); //額外寫一個"CharToNum"的Function,把後面讀到的9碼字元轉成數字
sum+=CharToInt(input[9]);
if(sum%10==0)
printf("real\n");
else
printf("fake\n");
} //end while(cin>>str)
}
遇到這個錯誤
後來我是將 input[10]改成 input[11]後就解決這個Fail。
但我疑問的是,其實我只有讀取10位,在迴圈也沒用更多的陣列元素,為什麼會發生溢位的情況?
大大知道原因的話,懇請賜教,感恩<(_ _)>
strcpy(a, b) 這個函式,會將 b 的內容複製到 a 並補上一個字串結尾字元「\0」。(因為 C 的字串就是這麼作字串的結尾的)
而「\0」理所當然地也佔一個字元的大小。所以只宣告 10 個字元大小的陣列是不夠的,因為輸入 10 + 結尾 1 = 11 個字元,會超過陣列大小。
以上。
strcpy(a, b) 這個函式,會將 b 的內容複製到 a 並補上一個字串結尾字元「\0」。(因為 C 的字串就是這麼作字串的結尾的)
而「\0」理所當然地也佔一個字元的大小。所以只宣告 10 個字元大小的陣列是不夠的,因為輸入 10 + 結尾 1 = 11 個字元,會超過陣列大小。
以上。
原來如此,是我對strcpy這個函式不夠熟,感謝解惑!