如何解决cin.ignore() 无法删除输入缓冲区
我有一个问题,cin.ignore()
无法从缓冲区中删除输入。
#include <iostream>
#include <string>
int main() {
using namespace std;
int x=0;
string k;
cin >> x;
cin.ignore(100,'\n');
cin.clear();
cin >> k;
cout << k << endl;
}
对于上面的代码:
input : abc (program ends when I just input abc)
output : abc
我真的很惊讶,因为 cin.ignore()
没有从输入缓冲区中删除 "abc"
。
我的代码有什么问题?
如果我改变 cin.ignore()
和 cin.clear()
的位置,效果很好,为什么?
解决方法
此代码:
int x=0;
cin >> x;
如果输入不可转换为 cin
,则导致 int
进入错误状态(特别是设置了 failbit
标志)。
std::basic_istream<CharT,Traits>::operator>>:
此函数表现为 FormattedInputFunction。构造并检查可以跳过前导空格的哨兵对象后,通过调用 std::num_get::get()
提取整数值。
...
如果提取失败(例如,如果在需要数字的地方输入了一个字母),value
将保持不变并设置 failbit
。
(直到 C++11)
如果提取失败,则将零写入 value
并设置 failbit
。对于有符号整数,如果提取的结果太大或太小而无法放入 value
,std::numeric_limits<T>::max()
或 std::numeric_limits<T>::min()
(分别)写入 和 failbit
标志设置。对于无符号整数,如果提取的结果太大或太小而无法放入 value
,则写入 std::numeric_limits<T>::max()
并设置 failbit
标志。
(C++11 起)
...
因此,流上的任何进一步 I/O 操作都将被禁用,例如 ignore()
,直到您clear()
错误状态以重新启用 I/O。
std::basic_ios<CharT,Traits>::clear:
通过为流错误状态标志分配 state
的值来设置它们。默认情况下,分配 std::ios_base::goodbit
具有清除所有错误状态标志的效果。
std::basic_istream<CharT,Traits>::ignore:
ignore
表现为 UnformattedInputFunction。在构造和检查哨兵对象后,它从流中提取字符并丢弃它们,直到出现以下任何一种情况:
...
C++ named requirements: UnformattedInputFunction:
UnformattedInputFunction 是一个流输入函数,它执行以下操作:
-
构造一个
basic_istream::sentry
类型的对象,具有自动存储持续时间,并将noskipws
参数设置为true
,执行以下操作-
如果在输入流上设置了
eofbit
或badbit
,也设置failbit
,并且如果在此输入流的failbit
上启用了异常异常掩码,抛出ios_base::failure
。 -
刷新
tie()
的输出流(如果适用)
-
-
通过调用
sentry::operator bool()
来检查哨兵的状态,相当于basic_ios::good
。 -
如果哨兵返回
false
或哨兵的构造函数抛出异常:-
将输入流中提取的字符数 (
gcount
) 设置为零 -
如果函数被调用写入一个
CharT
数组,则将CharT()
(空字符)写入数组的第一个位置
-
...
,cin.clear();
从 cin
中删除错误标志
和 cin.ignore();
忽略接下来的空格数。
由于您将 x
声明为整数并首先写入它,因此控制台希望首先读取一个整数。如果你首先输入 abc
而不是你输入的是一个字符串,控制台会返回一个错误标志,因为它需要一个整数。这就是您的程序在那之后立即结束的原因。
如果您将 cin.clear();
紧跟在 cin>>x
之后并键入 abc
,则抛出的错误标志将被忽略,控制台将继续显示 cin>>k
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。