gpt4 book ai didi

c++ - cin条件检查错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:52:10 24 4
gpt4 key购买 nike

我是一名学习 C++ 的初级程序员。我对 cin 命令有一个烦人的问题。在下面的程序部分,如果我在第一个 cin 命令中输入了错误的类型,程序将根本不会执行以下任何 cin 命令,但会执行程序的其余部分。

//start
#include <iostream>
using namespace std;
int main()
{
int x=0;
cout << endl << "Enter an integer" << endl;

//enter integer here. If wrong type is entered, goes to else
if (cin >> x){
cout << "The value is " << x << endl;
}
else {
cout << "You made a mistake" << endl; //executes
cin.ignore();
cin.clear();
}
cout << "Check 1" << endl; //executes
cin >> x; //skips
cout << "Check 2" << endl; //executes
cin >> x; //skips
return 0;
}
//end

代替 if else,如果我将相同的概念放入循环中而 (!(cin >> x))输入错误后程序进入无限循环。请帮我解释一下这种现象,因为我正在看的教科书说上面键入的代码应该按预期工作。

谢谢

最佳答案

cin 是一个输入流。如果发生错误,cin 会进入我们称之为“发生错误”的状态。虽然在此状态下无法进行字符输入,但您从输入流中收集字符的请求将被忽略。使用 clear() 您可以清除错误,输入流将不再忽略您。

这里是忽略函数原型(prototype)

istream&  ignore ( streamsize n = 1, int delim = EOF );

此函数从输入流中获取字符并丢弃它们,但是如果您的流忽略了您,您将无法获取任何字符,因此您必须先clear() 流然后忽略()它。

此外,请注意:如果有人输入,例如 "abc",在第一个输入请求中,您的 cin 只会得到一个字符,即 'a'"bc" 保留在缓冲区中等待被拾取,但是下一次调用 cin 会得到 'b' 'c' 保留在缓冲区中,因此您再次遇到错误。

此示例的问题在于,如果没有向其传递任何参数,cin.ignore() 只会忽略 clear() 之后的 1 个字符。第二个 cin 得到 'c' 所以你仍然有问题。

这个问题的一般解决方案是调用

cin.ignore(10000, '\n');

第一个数字必须是一些你不希望有人输入的大数字,我通常输入 10000。

此调用确保您从错误输入中拾取所有字符,或者在按下回车键之前拾取每个字符,这样您的输入流就不会两次进入“发生错误”状态。

关于c++ - cin条件检查错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14564771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com