我从 https://en.cppreference.com/w/cpp/io/basic_ios/clear 中读取了示例代码并尝试了以下操作:
命令行输入为:w
#include <iostream>
#include <string>
int main()
{
double n = 5.0;
std::cin >> n;
std::cout << std::cin.bad() << "|" << std::cin.fail() << "n";
std::cout << "hello" << "n";
std::cin.clear();
std::cout << std::cin.bad() << "|" << std::cin.fail() << "n";
std::cin >> n; //Why can't I input again here?
std::cout << "world" << "n";
std::cout << n << "n";
}
我不明白为什么程序在不允许我再次输入的情况下完成,我想我已经使用std::cin.clear()
重置了所有"失败"状态。
clear
只是重置错误标志,但它将导致失败的先前输入留在缓冲区中。因此,第二个cin >> n
将再次读取相同的输入,并将再次失败。因此,您将没有机会输入新输入。
您需要从缓冲区中获取错误字符(除了调用cin.clear()
(; 例如,使用cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n')
,它会忽略每个字符,直到第一次出现n
。您也可以使用fgets
,但与ignore
相反,fgets
需要一个缓冲区来存储您实际上不感兴趣的字符。