#19280: 遇到 *** buffer overflow detected *** 錯誤


lomchi39@gmail.com (JazzTraveler Yang)

學校 : 不指定學校
編號 : 100892
來源 : [210.242.50.91]
最後登入時間 :
2020-03-27 13:40:37
a020. 身分證檢驗 | From: [125.227.22.157] | 發表日期 : 2019-09-23 14:11

如題,我的程式碼在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)
}

遇到這個錯誤

 
#19281: Re:遇到 *** buffer overflow detected *** 錯誤


lomchi39@gmail.com (JazzTraveler Yang)

學校 : 不指定學校
編號 : 100892
來源 : [210.242.50.91]
最後登入時間 :
2020-03-27 13:40:37
a020. 身分證檢驗 | From: [125.227.22.157] | 發表日期 : 2019-09-23 14:14

 

後來我是將 input[10]改成 input[11]後就解決這個Fail。

但我疑問的是,其實我只有讀取10位,在迴圈也沒用更多的陣列元素,為什麼會發生溢位的情況?

大大知道原因的話,懇請賜教,感恩<(_ _)>

 
#19285: Re:遇到 *** buffer overflow detected *** 錯誤


inversion (「我們所認識的可符香是個像天使的好女孩」之葉林 *Cries...)

學校 : 國立清華大學
編號 : 43537
來源 : [49.159.6.107]
最後登入時間 :
2022-05-28 19:29:12
a020. 身分證檢驗 | From: [140.115.200.141] | 發表日期 : 2019-09-23 17:59

strcpy(a, b) 這個函式,會將 b 的內容複製到 a 並補上一個字串結尾字元「\0」。(因為 C 的字串就是這麼作字串的結尾的)

而「\0」理所當然地也佔一個字元的大小。所以只宣告 10 個字元大小的陣列是不夠的,因為輸入 10 + 結尾 1 = 11 個字元,會超過陣列大小。

 

以上。

 
#19362: Re:遇到 *** buffer overflow detected *** 錯誤


lomchi39@gmail.com (JazzTraveler Yang)

學校 : 不指定學校
編號 : 100892
來源 : [210.242.50.91]
最後登入時間 :
2020-03-27 13:40:37
a020. 身分證檢驗 | From: [59.124.231.64] | 發表日期 : 2019-09-27 10:47

strcpy(a, b) 這個函式,會將 b 的內容複製到 a 並補上一個字串結尾字元「\0」。(因為 C 的字串就是這麼作字串的結尾的)

而「\0」理所當然地也佔一個字元的大小。所以只宣告 10 個字元大小的陣列是不夠的,因為輸入 10 + 結尾 1 = 11 個字元,會超過陣列大小。

 

以上。



原來如此,是我對strcpy這個函式不夠熟,感謝解惑!

 
ZeroJudge Forum