在C ++中,你如何处理错误的输入?就像,如果程序要求一个整数,当你输入一个字符时,它应该能够做一些事情然后循环重复输入,但是当你需要一个整数时输入一个字符时循环变为无限,反之亦然。
答案 0 :(得分:44)
程序进入无限循环的原因是因为输入失败而设置了std::cin
的错误输入标志。要做的是清除该标志并丢弃输入缓冲区中的错误输入。
//executes loop if the input fails (e.g., no characters were read)
while (std::cout << "Enter a number" && !(std::cin >> num)) {
std::cin.clear(); //clear bad input flag
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //discard input
std::cout << "Invalid input; please re-enter.\n";
}
请参阅the C++ FAQ以及其他示例,包括在条件中添加最小值和/或最大值。
另一种方法是将输入作为字符串并将其转换为带std::stoi
的整数或其他允许检查转换的方法。
答案 1 :(得分:6)
最高投票的答案非常适合解决方案。
除了这个答案之外,这可能有助于想象出更好的情况:
int main()
int input = 1;//set to 1 for illustrative purposes
bool cinState = false;
string test = "\0";
while(input != -1){//enter -1 to exit
cout << "Please input (a) character(s): ";//input a character here as a test
cin >> input; //attempting to input a character to an int variable will cause cin to fail
cout << "input: " << input << endl;//input has changed from 1 to 0
cinState = cin;//cin is in bad state, returns false
cout << "cinState: " << cinState << endl;
cin.clear();//bad state flag cleared
cinState = cin;//cin now returns true and will input to a variable
cout << "cinState: " << cinState << endl;
cout << "Please enter character(s): ";
cin >> test;//remaining text in buffer is dumped here. cin will not pause if there is any text left in the buffer.
cout << "test: " << test << endl;
}
return 0;
}
将缓冲区中的文本转储到变量并不是特别有用,但它有助于可视化为什么需要cin.ignore()
。
我注意到对输入变量的更改也是因为如果你在条件中使用输入变量进行while
循环,或者在switch语句中它可能会陷入死锁,或者它可能满足条件你没想到,这可能会让你更难以调试。
答案 2 :(得分:-2)
测试输入以查看它是否是您的程序所期望的。如果不是,请提醒用户他们提供的输入是不可接受的。
答案 3 :(得分:-2)
如果ascii值介于65 t0 90或97到122之间,则可以通过ASCII值进行检查。