2010-05-26 30 views
2

我試圖在C++中變得更好(我知道一點)。我正在處理字符數組。我發現了一個練習,其目標是反轉字符數組(將其從整數轉換爲字符數組後)。我收到以下錯誤(使用VS2005):嘗試反轉字符數組時出錯

運行時檢查失敗#2 - 變量'revBuffer'周圍的堆棧已損壞。

當我通過代碼,我注意到以下:

revBuffer = 0x0012fe40 「100899ÌÌÌÌÌÌÌÌÌÌ998001」

相關的代碼如下。

char buffer[5]; 
    char revBuffer[5]; 
    int i; 
    int j=5; 
    long number = 998001; 

    itoa(number, buffer, 10); 

    for(i=0; i<strlen(buffer);i++) 
    { 
     revBuffer[j] = buffer[i]; 
     j--; 
    } 

任何幫助將是偉大的。 TIA!

+0

通過您的代碼只是跟蹤 - 看指數的值是會用於for循環的第一次迭代中。 – Cascabel 2010-05-26 15:22:58

+2

與你的bug無關,但你應該從'for for循環表達式中提取'strlen(buffer)',這樣它就不會在每個循環中被不必要地計算。 'strlen'通過掃描整個字符串直到它看到空終止符。我認爲把'strlen'留在循環中會是一種「過早悲觀化」(恕我直言)。 – 2010-05-26 15:36:06

+0

@Emile過早的悲觀,哈哈。 – WhirlWind 2010-05-26 15:36:58

回答

7

你是過度興奮的revBuffer。它的大小是5,這意味着你可以從0到4索引它,但是你在循環中使用的第一個索引是5.

+0

該死的。這是我的一個愚蠢的錯誤。所有的答案和建議都很有幫助。這個網站岩石!謝謝! – 2010-05-26 16:51:55

6

你正在轉換的數字有六位數 - 你使用的緩衝區只有大到足以容納4加上一個空終止符。使緩衝區更大。

2

當你的鍛鍊; Tibial是有幫助的,你應該記住,也存在:

std::reverse(buffer, buffer + 5); 
0

一開始,你想用的緩衝區是長時間存放6位數字,5個字符。

2

除了別人所說的之外,即使在修復了所有索引問題後,似乎也不會在revBuffer的最後一個字符中放置空終止符。您需要一定要做好

revBuffer[strlen(buffer)] = '\0'; 

這也是frought有問題的,因爲它假定緩衝區正確終止:)