如何处理输入流中留下的无关字符?(跳过) 对不起,这里的问题很简单,但我正在学习C++,我正在寻找处理这个问题的标准方法。我正在使用VS2005

如何处理输入流中留下的无关字符?(跳过) 对不起,这里的问题很简单,但我正在学习C++,我正在寻找处理这个问题的标准方法。我正在使用VS2005,c++,input,C++,Input,给定一个程序: #include <iostream> using namespace std; int main( ) { while ( true ) { cout << "enter anything but an integer and watch me loop." << endl; int i; cin >> i;

给定一个程序:

#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;
}
#包括
使用名称空间std;
int main()
{
while(true)
{       
我不能;
}
返回0;
}
如果您输入的不是整数,程序将不再允许您输入任何内容。现在,我意识到这是因为在格式失败后,流上还有输入,所以每次调用cincin.ignore(int num_bytes_to_ignore);我会的

您还可以使用stdio、fflush(fd);其中fd是stdout、stderr、stdin中的一个。

cin.ignore(int num_bytes_to_ignore);我会的


您还可以使用stdio、fflush(fd);其中fd是标准输出、标准输出、标准输入中的一个。

用if环绕cin调用

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

因此:

if(!cin>>i){
cin.clear();
cin.ignore(INT_MAX,'\n');

不能用if环绕cin呼叫

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

因此:

if(!cin>>i){
cin.clear();
cin.ignore(INT_MAX,'\n');

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

不要这样做。不要使用运算符>>混合格式化和未格式化输入。下面是一篇关于此主题的好文章:

基本上,代码更改为:

#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;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
while(true)
{           
我)不能打破;
}
返回0;
}

好的,我找到了答案。答案是

不要这样做。不要使用运算符>>混合格式化和未格式化输入。下面是一篇关于此主题的好文章:

基本上,代码更改为:

#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;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
while(true)
{           
我)不能打破;
}
返回0;
}


我没有看到“flush”成员函数,在cin之前调用ignore>>我没有解决问题。我可能只是错误地使用了ignore(),所以举个例子就好了。对不起,cin.flush确实不存在,您需要的是fflush(stdin)。我尝试添加了fflush(stdin)在调用cin之前,它仍然循环。必须有一种处理格式化输入的标准方法,对吗?fflush是输入流上未定义的行为。我没有看到“flush”成员函数,在cin之前调用ignore>>我没有解决问题。我可能只是使用ignore()不正确,所以最好举个例子。对不起,cin.flush确实不存在,您需要的是fflush(stdin)。我尝试添加了fflush(stdin)在调用cin之前,它仍然循环。必须有一种处理格式化输入的标准方法,对吗?fflush是输入流上未定义的行为。它返回一个流,可以转换为void*,可以转换为true或false,但我仍然要问如何处理?当然,我可以检测到错误的输入,但接下来呢?它是在Stream上我应该提到我使用的是VS2005,我使用的是iostream,但是cin是一个iStream是的…不起作用,我试过了。你在测试这个东西吗?我宁愿使用INT\u MAX“std::cin.ignore(std::numeric\u limits::MAX(),”\n“它返回一个流,可以转换为void*,可以转换为true或false,但我仍然要问如何处理?当然,我可以检测到错误的输入,但是什么?它仍然在流上我应该提到我使用的是VS2005,我使用的是iostream,但是cin是一个iStream是的……这不起作用,我已经尝试过了。您正在测试这些东西吗?而不是INT_MAX我会使用'std::cin.ignore(std::numeric_limits::MAX(),'\n')是的,我在寻找一种规范的方式来防止C++中的错误输入。这似乎是。继续前进,接受答案。去掉下注,答案实际上并没有错。).但这一个,虽然代码很难看,但工作得更好,更专业。好发现!我必须等两天才能接受它。再次感谢(是的,该死的难看代码)奇怪的是,人们投下一个投票,要么投票给正确的答案,要么提供更好的一个,如果他们知道的更好。至少添加一个评论……SeeHeHe你确实可以让我变成一个字符串并转换它。是的,我在寻找一个规范的方式来防止C++中的坏输入。这似乎是。继续接受答案。他投了反对票,答案实际上没有错(不再;-)。但这一条,虽然代码很难看,但效果更好,更专业。好发现!我必须等两天才能接受它。再次感谢(是的,该死的难看代码)奇怪的是,投反对票的人,要么投正确的一票,要么如果他们知道的更好,就提供更好的答案。至少加上一句评论……嘘