2017-02-27 59 views
-3

我寫了一個程序,詢問用戶有多少輛汽車目錄。該程序使用新創建一個動態陣列的許多汽車結構。接下來,它應該提示用戶輸入每個結構的製造和年份信息。爲什麼我應該在這裏使用這個「while」表達式?那個表達意味着什麼?

但是,我之前錯過了「WHILE」表達式。程序直接運行到最後。該結果如下:

enter image description here

和預期的結果應該是

enter image description here

什麼問題發生?當我需要用數字數據交替讀取字符串時該怎麼辦?

這裏是我的源代碼:

#include <iostream> 
#include <string> 
using std::string; 
// create car structure 
struct car 
{ 
    string make; 
    int year; 
}; 

int main() 
{ 
    using std::cout; 
    using std::cin; 
    using std::endl; 

    int num; 
    cout << "How many cars do you wish to catalog? "; 
    cin >> num; 
    while (cin.get() != '\n') 
     ; 

// create a dynamic array 
    car * catalog = new car [num]; 

//store 
    for (int i = 0; i < num; ++i) 
    { 
     cout << "Car #" << i + 1 << ":\n"; 
     cout << "Please enter the make: "; 
     getline(cin, catalog[i].make); 
     cout << "Please enter the year made: "; 
     cin >> catalog[i].year; 
     while (cin.get() != '\n') 
      ; 

    } 

//display 
    cout << "Here is your collection: \n"; 
    for (int i = 0; i < num; ++i) 
    { 
    cout << catalog[i].year << " " << catalog[i].make << endl; 
    } 

    delete [] catalog; 

    return 0; 
    } 
+0

那'while'聲明跳到輸入行結束的方式。 –

+0

用'cin.ignore(numeric_limits :: max(),'\ n')' – user4581301

+0

可能會節省一點時間(但不能打字)謝謝! @Captain Obvlious –

回答

0

當你輸入的東西std::cin,時時會出現拖尾'\n',因爲你最終用回車鍵輸入。
當您調用cin >> num時,std::cin將只提取數字,而不是尾隨'\n'。因此,在此之後,尾隨'\n'將仍然存在於輸入緩衝區中。
然後當您在此之後致電getline時,它將讀取(並放棄)'\n'

我的建議:不要混合std::cin.operator >>getline
儘管兩者都會提取並丟棄領先的空格,但getline將始終將'\n'作爲輸入的結尾,並將提取並丟棄它。
另一方面,std::cin.operator >>將不會讀取'\n',並將它視爲只是一個空白。

+1

哦,我明白了。比你非常! @Dannyu NDos –

0
While(cin.get()!='\n'); 

這行代碼消除了輸入緩衝區中的換行符。

但問題是爲什麼?

因爲該行

getline(cin, catalog [i].make); 

什麼是該行的問題?

問題在這裏,getline()函數從輸入緩衝區讀取內容直到找到'\ n'。當您執行上述代碼時

cin>>catalog[i].made 

您將鍵入數字並按下回車鍵。但在這種情況下,'\ n'將保留在緩衝區中。如果'\ n'仍然在緩衝區中,那麼getline()函數將讀取'\ n',並且它會假定您已經輸入了輸入。但實際上沒有數據被讀取。

所以不要使用函數getline(),而不是

cin>>catalog[I].make; 
+0

其實在這一行我想輸入字符串和getline()方法可能可以讀取'\ n',對不對? –

+0

我知道你的意思。問題發生在cin >> num [ENTER]非常感謝! –

相關問題