我知道如何在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;
}
答案 0 :(得分:2)
一旦流处于错误状态,所有读取操作都将失败。这意味着,如果cin >> num
读取失败,则get()
调用的循环将永远不会结束:所有这些get()
都将失败。只有在清除错误状态后才能跳到行尾。
答案 1 :(得分: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
功能会删除num
字符串中的所有字符,但使用带有std::remove_if
谓词的std::isdigit
std::stringstream
来删除。{/ li>
boost::lexical_cast
也可以使用)擦除函数实现的逻辑可以是任何其他逻辑,但是这个代码可能比问题中包含的逻辑简单得多。
答案 2 :(得分:0)
我会使用getline(cin,num)接近它,然后使用cin.fail()捕获任何失败。我通常使用带有整数的cin.fail()但理论上也应该使用字符串和字符,例如:
string num;
getline(cin,num);
if(cin.fail())
{
cin.clear();
cin.ignore();
}
答案 3 :(得分: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;
}
之后,您可以继续使用您想要的任何代码
答案 4 :(得分:0)
要清除输入流,请使用cin.sync()。 无需使用cin.clear()或cin.ignore()。