cin条件检查错误

Posted

技术标签:

【中文标题】cin条件检查错误【英文标题】:cin condition checking error 【发布时间】:2013-01-28 15:00:17 【问题描述】:

我是一名学习 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)) 输入错误的输入后,程序进入无限循环。 请帮我解释一下这种现象,因为我所遵循的教科书说上面输入的代码应该按预期工作。

谢谢

【问题讨论】:

clear() 第一,ignore() 第二。 谢谢老兄!!现在工作:) 为什么其他方式不起作用?? 【参考方案1】:

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

这里是忽略函数原型

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

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

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

这个例子的问题是cin.ignore()如果没有参数被传递给它只会忽略clear()之后的1个字符。第二个cin 得到'c' 所以你还是有问题。

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

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

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

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

【讨论】:

感谢 CodeJunkie,我在更正代码后遇到了这个问题。经过一番谷歌搜索,我找到了 cin.sync(),它摆脱了整个现有的输入流。我用 cin.ignore() 代替了它,效果也很好!!。【参考方案2】:

您可能还想尝试 if ( std::cin.fail() )

作为备用,以防止在提示时输入错误类型而导致崩溃

【讨论】:

您能否详细说明这有什么帮助?

以上是关于cin条件检查错误的主要内容,如果未能解决你的问题,请参考以下文章

用 cin 检查用户整数输入会产生无限循环

PHP:检查 MySQL TABLE 是不是已作为错误条件存在? [复制]

C ++中的GFG括号检查器问题给出错误答案

如何使用 NSError 初始化、传递参数和检查错误条件**

Wix工具集:连续检查条件

即使使用 `?` 链接或条件检查,Typescript Partial<T> 也会导致未定义的错误