C++;Cin忽略非整数? 我有一个关于C++的问题。我一直在寻找答案,但没有找到任何可以修复我的代码的方法。所以我决定问问自己。我的问题是,我制作了一个小程序,它将输出一周中的某一天,因此如果用户输入1,它将输出一周中的第一天(周日或周一,取决于您居住的地方),依此类推。但是,如果用户输入例如8,则程序将输出“请选择一个介于1和7之间的数字!” 然而,我的问题是,当用户输入一个字符或随机单词时,它将永远循环“请选择一个介于1和7之间的数字!” #包括 #包括 #包括 使用名称空间std; int main(){ int输入; 做{ cin>>输入; 开关(输入){ 案例1: cout
IO操作设置有关流当前状态的标志 这些都是重要的标志,如果读取输入,您应该注意这些标志C++;Cin忽略非整数? 我有一个关于C++的问题。我一直在寻找答案,但没有找到任何可以修复我的代码的方法。所以我决定问问自己。我的问题是,我制作了一个小程序,它将输出一周中的某一天,因此如果用户输入1,它将输出一周中的第一天(周日或周一,取决于您居住的地方),依此类推。但是,如果用户输入例如8,则程序将输出“请选择一个介于1和7之间的数字!” 然而,我的问题是,当用户输入一个字符或随机单词时,它将永远循环“请选择一个介于1和7之间的数字!” #包括 #包括 #包括 使用名称空间std; int main(){ int输入; 做{ cin>>输入; 开关(输入){ 案例1: cout,c++,while-loop,cin,C++,While Loop,Cin,IO操作设置有关流当前状态的标志 这些都是重要的标志,如果读取输入,您应该注意这些标志 badbit-i/o操作上的读/写错误 failbit—i/o操作上的逻辑错误 eofbit-输入操作时达到文件结尾 如果将字符传递到需要int的流(整体传递错误的数据类型,无法转换为cin需要的类型),则设置failbit 这就是插入错误输入后进入无限循环的原因。failbit已设置且未清除cin,因此下一次读取操作也一次又一次失败 要做的事情是取消设置failbit,并使用ignore放弃输入缓冲区中
- badbit-i/o操作上的读/写错误
- failbit—i/o操作上的逻辑错误
- eofbit-输入操作时达到文件结尾
int
的流(整体传递错误的数据类型,无法转换为cin
需要的类型),则设置failbit
这就是插入错误输入后进入无限循环的原因。failbit
已设置且未清除cin
,因此下一次读取操作也一次又一次失败
要做的事情是取消设置failbit
,并使用ignore
放弃输入缓冲区中的错误输入
std::cin.clear(); // without params clears flags
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Clear input buffer
并且std::cin.eof()
将告诉您如果设置了eofbit
,请达到eof
(std输入时按CTRL+D/+Z)
语句
cin>>输入可能失败,例如,如果用户输入的内容无法转换为整数值,或者流达到EOF
(例如,标准输入中的CTRL-D或CTRL-Z)。
如果cin>>input
失败,则会发生两件事:第一,设置错误状态,指示失败的类型。第二,表达式返回false
,指示未向input
写入任何值
因此,在继续之前,您应该始终检查cin>>…
的结果。如果检测到无效输入,则必须在再次读取之前重置错误标志(使用cin.clear()
),并且您可能希望跳过无效输入(使用cin.ignore(…)
),以避免读取相同的输入(无效)反复输入:
int main() {
int input;
while (true) {
while (!(cin >> input)) {
if (cin.eof()) {
cout << "user terminated input." << endl;
return 0;
}
cout << "invalid input (not a number); try again." << endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
}
// from here on, you may rely that the user has input a number.
cout << input;
// ... your code goes here
}
return 0 ;
}
intmain(){
int输入;
while(true){
而(!(cin>>输入)){
if(cin.eof()){
这是正常的。你从不检查输入是否正常。
int input;
cin >> input;
while (! cin.fail())
{
// Process data
cin >> input;
}
if (cin.eof())
{
// End of file (input) reached
// Terminate reading
}
int main() {
int input;
while (true) {
while (!(cin >> input)) {
if (cin.eof()) {
cout << "user terminated input." << endl;
return 0;
}
cout << "invalid input (not a number); try again." << endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
}
// from here on, you may rely that the user has input a number.
cout << input;
// ... your code goes here
}
return 0 ;
}