如何清空C 中的输入流
How to empty the input stream in C++?
我知道如何在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()。
相关文章:
- 如何忽略输入流中的某些字符?
- 如何清除/清空已打开的文件C++
- 使用完数据结构后清空数据结构是一个好习惯吗?
- C++输入流.与 cin unget() 函数有点混淆
- 从输入流中读取行,并能够跳过块
- 这个用于清空链表的代码可以吗?
- 使用 Visual Studio 代码读取 C++ 中的输入流时出错
- 处理输入流运算符>>中的无效输入
- 树莓派上的端口音频,找不到输入流的设备
- Boost::asio::streambuf consumption() 不清空缓冲区
- 如何将C++输入流分隔符包含在结果令牌中
- 如何从对象的指针清空 std::set?
- 提升进程流为空
- 如果两个输入流相等,我如何构造主()到输出是
- 如何在 while 循环C++中检查 int 输入是否为空或用户按 Enter 键
- 使用非成员函数从输入流中提取类对象
- 如何清空C 中的输入流
- 字符串流缓冲区在 Objective-C++ 中不会清空
- 使用rdbuf复制流在空输入时失败
- Pthread_create似乎清空了传递给输入函数的参数