如何应对外来字符留在输入流? (CIN跳过)(How to cope with extraneo

2019-08-02 04:34发布

对不起,这里的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 <<我刚读了下一终线(我认为)。 你们如何清除出这个问题的流或交易? 它必须是很常见的。

Answer 1:

围绕与如果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()重置所有标志,以一个良好的状态。 拥有一大批直到“\ n”应该工作cin.ignore。



Answer 2:

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

不要这样做。 不要混合格式和无格式使用输入操作符>>。 下面是关于这个问题的好文章:

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;
}


Answer 3:

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

您还可以使用标准输入输出,fflush(FD); 其中fd是标准输出,标准错误,标准输入之一。



文章来源: How to cope with extraneous characters left on the input stream? (cin skipped)
标签: c++ input