c++ cin.clear()到底是什么意思呢

问题描述:

c++ cin.clear()到底是什么意思呢
int i;
for(i=0;i
1个回答 分类:综合 2014-12-11

问题解答:

我来补答
if(!cin)判断是否输入正确,如果输入错误的类型 比如你想输入 int类型 结果输入了char 则会出现cin输入错误
fail() 被设定为真 failbit被设定 cin被标记错误 不可用( 意思是 出现不匹配 )然后就得用clear()清除错误状态 就是清除错误状态 (也就是把failbit设置为0)然后还得用 while(cin.get()!='\n')
continue;
吸收缓冲区 也就是错误字符后面的字符之类的 知道换行符 例如想输入 123 结果输入123ab456.就用上面的做法 解决了 发现cin又可用了.
再问: 就是说如果输入123ab456的话,首先会接受到123,然后if(!cin)发现不是匹配的类型,出错,failbit被设定了,然后用clear()把被设定的failbit修改到原来的状态,接着继续接受456,直至遇到换行?所谓的while(cin.get()!='\n')吸收缓冲区是指?
再答: 哦 是这样的 因为遇到了a所以会把cin的failbit设定为1 所以会出现cin错误 所以ab456依然留在缓冲区 (因为cin是靠缓冲区读取的 其中123ab456从键盘输入保存在缓冲区) 用clear() 清除的 是状态 也就是failbit 设置为0 让 cin可用 但是如果不清除缓冲区 则在读取缓冲区的a时 又被设定failbit=1 所以 只能用while(cin.get()!='\n') 去读取掉剩下的缓冲区 直至遇到换行 (也就是读取ab456和\n 直到退出while)这样就可用cin继续从键盘到缓冲区 中读取int了 注意一点:你想不是正确的(failbit被设定了,然后用clear()把被设定的failbit修改到原来的状态,接着继续接受456) 不是这样的 cin不会这样读取 应该是清除状态 只是让它可用 他还会继续去读ab456 但是继续碰到'a’还是设置 failbit=1 不会跳过ab去读456
再问: 就是当用户输入错误的类型后failbit会被设置为1,这时用clean()是将failbit设置为0,从而可以继续接受后面的数据。 而while(cin.get()!='\n') continue; 就是一个一个判断数据 那为什么while不放在(!cin)的前面呢,如果按照上面读取当下面while(cin.get()!='\n'读取数据时遇到错误类型,那不就不能用cin.clean清楚状态了 是不是应写成 while(cin.get()!='\n') { cin>>temp; if(!cin) cin.clean() continue; }
再答: cin.get()是读取字符 例如:除非碰到EOF否则他会读取你输入所有合法的字符 如果是'\n’那么 它会跳出循环 也不会设 faibit=1;且cin>>temp; 是读取整型 用while 岂不是先得读取个字符 然后把后面赋给temp 但是如果中间碰到字符 但就得把字符后面的数字在给 temp 例如: int temp=90; while(cin.get()!='\n') { cin>>temp; if(!cin) cin.clear(); continue; } couttemp 读取不了 清除 然后被get()吸收a 又碰到b 同理被设置 清除 get()吸收b 但是这是 cin>>temp碰到456可以被读取了 又把456给了temp 所以 输入123ab456 则 先把23给temp 少了个1 却被get()但字符吸收了(误差和真的不小啊) 然后碰到456被赋给temp; 所以输出456 如果你直接输入一个 '\n'那么直接退出不设置failbit 因为合法 所以输出 90
 
 
展开全文阅读
剩余:2000