如何处理输入流上剩余的无关字符? (cin跳过)

时间:2009-08-23 00:35:32

标签: c++ input

对不起这里的noobish问题,但我只是在学习C ++,我正在寻找处理这个问题的标准方法。我正在使用VS2005。

给定一个程序:

#include <iostream>

using namespace std;

int main( )
{
    while ( true )
    {       
        cout << "enter anything but an integer and watch me loop." << endl;     
        int i;
        cin >> i;               
    }
    return 0;
}

如果输入除整数之外的任何内容,程序将永远不允许您再输入任何内容。现在,我意识到这是因为在格式失败后流上还有输入,所以每次调用cin&lt;&lt;我只是读到下一个结束行(我想)。你们如何清理流或处理这个问题?这一定很常见。

3 个答案:

答案 0 :(得分:2)

用if覆盖cin调用。

如果读取了错误的数据,cin将返回false。

这样:

if (!cin >> i) {
  cin.clear();
  cin.ignore(INT_MAX, '\n');
  cout << "Haha, your looping efforts have been thwarted dear sir\n";
}

cin.flush()应该诀窍(根据cppreference.com),但显然不是VS.

cin.clear()将所有标志重置为良好状态。 cin.ignore有一个很大的数字,直到'\ n'应该工作。

答案 1 :(得分:2)

好吧,我找到了答案。答案是......

不要这样做。请勿使用运算符&gt;&gt;混合格式化和未格式化的输入。这是一篇关于这个主题的好文章:

http://www.cplusplus.com/forum/articles/6046/

基本上,代码更改为:

#include <iostream>
#include <string>
#include <stream>

using namespace std;

int main( )
{
    while ( true )
    {           
        cout << "enter anything but an integer and watch me loop." << endl;     
        string input;
        getline( cin, input );
        int i;
        stringstream stream( input );
        if ( stream >> i ) break;                       
    }
    return 0;
}

答案 2 :(得分:0)

cin.ignore(int num_bytes_to_ignore);会做的。

你也可以使用stdio,fflush(fd);其中fd是stdout,stderr,stdin之一。