C++初学者指南-2.输入和输出—从输入流错误中恢复
文章目录
- C++初学者指南-2.输入和输出---从输入流错误中恢复
- 怎么了?
- 解决方案:出错后重置输入流
怎么了?
示例:连续输入
int main () {
cout << "i? ";
int i = 0;
cin >> i; // ← 第一次
cout << "j? ";
int j = 0;
cin >> j; // ← 第二次
cout << "i: " << i <<", "
<< "j: " << j <<'\n';
}
有效输入⇒预期行为
$ i? 2
$ j? 3
i: 2, j: 3
i 的输入无效⇒无法读取 j
$ i? asdf
i: 0, j: 0
为什么会这样?
如果 cin 在以下代码片段中
int i = 0;
cin >> i;
读取无法转换为 int 类型的字符:
- cin 的错误位被设置了。
- cin的缓冲区内容没有被丢弃,仍然包含有问题的输入。
- 任何尝试从cin读取整数的操作也会失败。
解决方案:出错后重置输入流
- 清除 cin 的错误位。
- 清除 cin 的输入缓冲区。
void reset_cin () {
// 清除所有错误状态位
cin.clear();
// 清除输入缓冲区
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
int main () {
cout << "i? ";
int i = 0;
cin >> i; // ← 1st
if (cin.fail()) reset_cin();
cout << "j? ";
int j = 0;
cin >> j; // ← 2nd
cout << "i: " << i <<", "
<< "j: " << j <<'\n';
}
i 的无效输入不会影响 j
$ i? asdf
$ j? 3
i: 0, j: 3
附上原文地址
如果文章对您有用,请随手点个赞,谢谢!^_^