如何在C++中清空输入流?

3

我知道如何在C中做到这一点,但对于C++解决方案毫无头绪。我希望以下操作是安全的,在提供输入字符串或字符后,程序不会挂起。如何读取包括\n在内的输入流以使其自由?

int main() {
    int num;
    do { 
        std::cin.clear();
        std::cin >> num;
        while ( std::cin.get() != '\n' );
    } while ( !std::cin.good() || num > 5 );
    return 0;
}

你不应该在清除状态之后才前进到新行吗? - R. Martinho Fernandes
std::getline(std::cin, string)是什么意思? - maverik
@maverik,你指的是哪个字符串? - infoholic_anonymous
@R.MartinhoFernandes 我不明白这种情况下会有什么区别。 - infoholic_anonymous
5个回答

2

一旦流处于错误状态,所有读取操作都会失败。这意味着,如果cin >> num读取失败,带有get()调用的循环将永远不会结束:所有这些get()都会失败。只有在清除错误状态后才能跳到行末。


1

在 R. Martinho Fernandes 的回答基础上,这里提供了一个可能的 C++ 代码替代方案:

std::string num;
std::getline(std::cin, num);

// Arbitrary logic, e.g.: remove non digit characters from num
num.erase(std::remove_if(num.begin(), num.end(),
            std::not1(std::ptr_fun((int(*)(int))std::isdigit))), num.end());

std::stringstream ss(num);
ss >> n;
  • std::getline 函数从 cin 中提取字符并存储到 num 中。它还提取并丢弃输入末尾的分隔符(您可以指定自己的分隔符,否则将使用 \n)。
  • string::erase 函数使用带有负 std::isdigit 谓词的 std::remove_ifnum 字符串中删除除数字以外的所有字符。
  • 然后使用 std::stringstream(也可以使用 boost::lexical_cast)将字符串表示为整数。

这里实现的逻辑可以是任何其他逻辑,但是这段代码可能比问题中包含的代码更容易阅读。


0
一种方法是在每次输入后检查状态,并在发生异常时抛出异常,例如:
#include<iostream>
using namespace std;

int main(){

int a;
cout<<"Enter a number: ";
cin>>a;

//If a non number is entered, the stream goes into a fail state
try
{
    if(cin.fail()){
        throw 0;
        cin.clear();
        cin.ignore();
    }
}
catch(int){
    cin.clear();
    cin.ignore();
}
return 0;
}

之后,您可以继续使用任何您想要的代码


0
我会使用getline(cin,num)来处理它,然后使用cin.fail()捕获任何失败。我通常在int类型中使用cin.fail(),但理论上也可以在字符串和字符中使用,例如:
    string num;
    getline(cin,num);
    if(cin.fail())
    {
      cin.clear();
      cin.ignore();
    }

0

为了清空输入流,请使用 cin.sync()。 无需使用 cin.clear() 或 cin.ignore()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接