2016-07-23 91 views
1

爲什麼當用戶輸入多個字母時,控制檯會顯示「以米爲單位的道路多長時間」和「請輸入介於0到250之間的整數」。不止一次爲什麼在輸入字母時會多次循環?

例如,如果我輸入「ABC」,控制檯將顯示此:

多久米

ABC

請輸入一個整數,它是0和之間的道路250. 是多久米

請輸入一個整數,它有多長是米

道路250之間0和 道路

請輸入一個整數,它有多長是米路250之間0和

while (!valid) 
    { 
     cout << "how long is the road in meters " << endl; 
     cin >> road; 
     valid = true; 
     if ((cin.fail()) || ((road > 250) || (road < 0))) 
     { 
      cin.clear(); 
      cin.ignore(); 
      cout << "Please enter an Integer which is between 0 and 250." << endl; 
      valid = false; 
     } 
    } 

回答

1

cin.ignore();相當於cin.ignore(1,EOF); 所以,你只跳過1個字符,但在CIN緩衝區有3 。 你應該叫

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');而不是清除整個緩衝區

根據@ mszymborski的評論編輯。

編輯2:添加std::,並注意的std :: numeric_limits的使用需要#include <limits>

+3

'numeric_limits :: max()'會比像'1000'這樣的怪異常數更好。只是因爲它不是一個更大的計劃,我們不應該寫得體面。 – mszymborski

+0

是的,那會更準確。 –

0

的故障狀態被觸發,在符「是一種」自進入「ABC」。然後清除錯誤忽略此char和循環。輸入流中的下一個可用字符是b,依此類推。

如果你要處理的輸入作爲一個整體,你可以使用讀取一個字符串(或實線)和解析字符串stringstream

getline(cin, line); 
    stringstream sst(line); 
    sst>>road; 
    if ((sst.fail()....) 
     ... 

Online demo

相關問題