2011-09-20 84 views
1

我試圖讀取用戶輸入的值,把他們放到一個字符串類數組中,但我得到一個BAD EXCESS錯誤,我猜它的事情很簡單,我做錯了。這是我得到的。任何幫助將是巨大的C++字符串類輸入

int main() 
{ 
    const int SIZE = 5; 
    string fruity[SIZE]; 
    int i; 

    cout << "Enter the names of five kinds of fruit:" << endl; 
    for(i = 0; i < SIZE; i++) 
    { 
     cout << "Enter Name of Fruit" << endl; 
     getline(cin, fruity[i]); 
    } 

    cout << fruity[i] << endl; 

    return 0; 
} 
+2

什麼是「壞過剩」 ......?暴飲暴食? –

+0

因爲我試圖自我教導 – hart929

回答

4
cout << fruity[i] << endl; 

這是無效的。做到這一點,而不是:

for(i = 0; i < SIZE; i++) 
    cout << fruity[i] << endl; 

因爲在這一點上你的i將等於SIZE,並是無效的。

+0

,所以在技術上沒有功課,那麼現在已經有用戶輸入值填充的「水果」數組? – hart929

+0

他在哪裏做'水果[]'? – quasiverse

+0

'水果[0]'應該'水果[我]'?? –

2

在for循環之後,變量i的值爲SIZE,所以當您嘗試訪問它時,您將出現界限。你將不得不使用另一種循環,如果你想輸出它像這樣:

for (i = 0; i < SIZE; i++) { 
    cout << fruity[i] << endl; 
} 
+0

'i'在'for'循環之外聲明。 –

+0

Eugh。那裏發生了什麼。編輯來解決真正的問題。 – quasiverse

+0

那麼數組現在由輸入填充了嗎?所以如果我想把它發送到選擇類別,我可以嗎? – hart929

0

你需要一個循環:

for(int i = 0; i < SIZE; i++) 
{ 
    cout << fruity[i] << endl; 
} 
+1

使用'#include '循環或'std :: for_each'。 – ssube

1

在下面的語句

cout << fruity[i] << endl; 

「i」是超出範圍。當退出for循環「5」時,「i」的值你的編譯器應該警告過你在for循環的範圍之外使用「i」。你的for循環設置果味[0],果味[1],果味[2],果味[3],果味[4],但「果味[5]」超出範圍。因此,當您嘗試打印「水果[i]」時會產生垃圾數據。這導致seg故障崩潰。

1

始終使變量地方儘可能。 C++允許您在循環內定義循環變量

for(int i = 0; i < SIZE; i++) 
{ 
    ... 
} 
// i no longer in scope 

以便它們在循環結束時超出範圍,這與本地獲得的範圍相同。

這樣做,就會發現你正在使用i訪問數組循環後,在這一點i具有價值SIZE,導致訪問越界的。 (記住,數組中有索引0..SIZE-1

我不知道在你的程序

cout << fruity[i] << endl; 

最後一行應該做的事,但如果你想輸出數組的conetent(如其他答案建議),你確實需要另一個循環。

其他更小的點:

  1. 我們真的不知道你用的是什麼串類,因爲您省略了std::前綴。 (對於您使用的標準庫中的所有其他標識符也是如此。)I disapprove of that

  2. 數組索引的正確類型是std::size_t

  3. std::endl機械手將插入一個'\n'到輸出流中並沖洗流的緩衝區。在您的交互式控制檯程序中,這通常不會造成任何傷害。但請記住,過早刷新緩衝區可能會大大減慢程序的速度。 (我曾見過一個案例是一個程序將大量數據寫入文件流中,幾個字節的涓流由於此而減慢了一個數量級。)在這種情況下,手動刷新輸出流#s緩衝區從來沒有真正的必要。 (當然,你想你會提示您從輸入流中讀取之前出現,但是這是由std::cout被捆綁到std::cin默認情況下實現的,使得std::cout沖洗每當程序試圖從std::cin閱讀。)

程序,我會寫出來,應該是這樣的:

// Beware, brain-compiled code ahead! 
#include <string> 
#include <iostream> 

int main() 
{ 
    const std::size_t size = 5; 
    std::string fruity[size]; 

    std::cout << "Enter the names of five kinds of fruit:" << '\n'; 
    for(std::size_t i = 0; i < size; ++i) 
    { 
     std::cout << "Enter Name of Fruit" << '\n'; 
     std::getline(std::cin, fruity[i]); 
    } 

    for(std::size_t i = 0; i < size; ++i) 
    { 
    std::cout << fruity[i] << `\n`; 
    } 

    return 0; 
}