2016-01-08 42 views
1

以下是代碼。它包含一個結構學生與int rno和字符串名稱作爲成員。我使用循環來讀取所有學生變量的成員。但是,只要我輸入任何字母,程序就會終止。此外,輸入的字符串不會顯示。程序在讀取所有結構成員之前終止

#include <iostream> 
#include <string> 

using namespace std; 
int main() { 
    struct student { 
     int rno; 
     string name; 
    }; 

    student s[4]; 

    int i; 
    for(i = 0; i < 4; ++i) { 
     cin >> s[i].rno; 
     getline(cin, s[i].name); 
    } 

    string line = ""; 
    for(i = 0; i < 80; ++i) line += '-'; 

    cout << line << "ROLL\tNAME\n" << line << '\n'; 

    for(i = 0; i < 4; ++i) { 
     cout << s[i].rno << '\t' << s[i].name << '\n'; 
    } 
} 

謝謝。

+1

似乎是爲我工作的罰款,你有沒有嘗試使用Valgrind的運行呢? – mic4ael

回答

2

您的問題是使用>>流運算符,然後使用getline沒有沖洗的任何不必要的換行字符流。

然後,當你在下一個結構中讀取時,你會得到你想要成爲之前元素名稱的字符串,並且你的流可能無法讀取整數(除非名稱以數字開頭)。

所以你的閱讀循環應該使用cin.ignore(MAX_INT,'\n')或代替MAX_INT某些值比任何你期望的行更長。

cin.ignore將忽略下一個X字符或直到它到達指定字符(在此例中爲MAX_INT字符或直到它到達換行符字符'\n')。

您閱讀for循環看起來像:

for (i = 0; i < 4; ++i){ 
    cin >> s[i].rno; 
    cin.ignore(MAX_INT, '\n'); 
    getline(cin, s[i].name); 
} 
+0

謝謝爲了解釋! max_int應該比rno中的數字大嗎?即它應該大於no。之前輸入的字符? –

+0

是的,我只是使用MAX_INT,如果它在我使用的系統上定義。我不確定是否所有系統都定義了它。但是如果需要的話,你也可以在標準庫中使用numeric_limits。 –

0

嘗試添加cin.ignore()得到INT類型和前後獲得字符

,併爲獲得char陣列,最好使用gets()

#include <iostream> 
#include <string> 
using namespace std; 

struct student { 
    int rno; 
    string name; 
}; 

int main() { 
    student s[4]; 
    int i; 
    for(i = 0 ; i < 4 ; ++i) { 
     cin >> s[i].rno; 
     cin.ignore(); 
     gets(s[i].name); 
    } 
    string line = ""; 
    for(i = 0 ; i < 80 ; ++i) line += '-'; 
    cout << line << "ROLL\tNAME\n" << line << '\n'; 
    for(i = 0 ; i < 4 ; ++i) 
     cout << s[i].rno << '\t' << s[i].name << '\n'; 
} 

cin離開換行符在流。將cin.ignore()添加到下一行將清除/忽略流中的換行符。
這主要用於cin和getline的組合。

看到documentationquestion

+0

謝謝你解決了!但是,究竟發生了什麼?爲什麼要輸入終止程序 –

+1

爲什麼我們需要'get'而不是'getline'? – Steephen

+1

回答修改描述@Tim –

相關問題