2016-07-23 83 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

相关问题