如何清空C 中的输入流

How to empty the input stream in C++?

本文关键字:输入流 清空 何清空      更新时间:2023-10-16

我知道如何在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;
}

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

构建在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函数使用num字符串的数字除了数字,使用std::remove_if带有负std::isdigit谓词。
  • 然后使用std::stringstream表示字符串为整数(boost::lexical_cast也可以工作)

擦除函数实现的逻辑可以是任何其他逻辑,但是此代码可能比问题中包含的逻辑要简单得多。

我将使用getline(cin,num)对其进行处理,然后使用cin.fail()捕获任何失败。我通常使用ints的cin.fail(),但理论上也应该与字符串和字符一起使用,例如:

    string num;
    getline(cin,num);
    if(cin.fail())
    {
      cin.clear();
      cin.ignore();
    }

一种方法是在每个输入后检查状态例如:

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

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

要清除输入流,请使用cin.sync()。 无需使用cin.clear()或cin.ignore()。