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

int i;
for(i=0;i<num;i++)
{
int temp;
cout<<"Please input the # "<< (i+1)<<" number: "<<endl;
cin>>temp;
if(!cin)
{
cin.clear();
while(cin.get()!='\n')
continue;
cout<<"Bad input"<<endl;
break;
}
else if(temp<0)
break;
array[i]=temp;

能不能详细地解释一下if(!cin)
{
cin.clear();
while(cin.get()!='\n')
continue;
cout<<"Bad input"<<endl;
break;
}
这段语句里if(!cin),clear()和while的那条语句到底是干什么的呢,为什么一定要while和clear的那条语句呢,求解求解,谢谢

当cin函数输入错误的时候,cin里面有个函数可以自动检测到输入错误,若想继续输入便要清楚掉这个错误。可以利用函数cin.rdstate()函数来读取错误的标识符看看。

#include <iostream>using namespace std;int main(){

int number;

cin>>number;

cout<<"first input"<<endl;

cout<<cin.rdstate()<<endl;

cin>>number;

cout<<"end input!"<<endl;

system("pause");

return 0;}

扩展资料

c++中的cin函数语法

C++中的cin函数和C语言的scanf函数同理,均为从键盘中接收输入内容。

基本格式:cin>>要输入的内容;

cin函数输入遇到空格,TAB键,回车也会终止输入

例如:想要输入zhang san

cin>>str;那么str只会接收zhang这个字符串,遇到空格自动结束输入。

C++中提供cin.getline(str,50),此时只遇到回车才会结束输入,那么str中存储了zhang san这个完整的字符串。

温馨提示:内容为网友见解,仅供参考
第1个回答  2019-09-03
实际测试了一下楼上大神的解答思路发现一些问题:
输入字母开头时 例如a123 b456 代码会报错“Bad input”
但当数字开头连接字母时 例如123a 4bc 代码正常运行 不会报错

大家可以试试
第2个回答  推荐于2017-11-24
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;
}
cout>temp 读取不了 清除 然后被get()吸收a 又碰到b 同理被设置 清除 get()吸收b 但是这是
cin>>temp碰到456可以被读取了 又把456给了temp

所以 输入123ab456
则 先把23给temp 少了个1 却被get()但字符吸收了(误差和真的不小啊)
然后碰到456被赋给temp;
所以输出456
如果你直接输入一个 '\n'那么直接退出不设置failbit 因为合法
所以输出 90

本回答被提问者采纳
第3个回答  2018-11-01
非常感谢,在读C++ Primer也碰到此问题

C++中关于cin.clear()的问题
cin.clear()可以理解为清除的意思。当cin的状态被设置为错误状态了,调用cin.clear(istream::failbit)可以清除这个failbit(输入失败)状态复位到初始状态。 一般来说程序中多用if(!cin){cout<<"error";}这样类似的句式来检查输入流,用于保证输入的无误。

c++里面的cin.clear()是什么意思啊?
cin.clear(); \/\/清除cin流的错误状态 C++语句cin.clear();中的clear()是什么函数,原型是?答:检举将一个出错的流的状态恢复为“好”。但也不完全是,因为它也可以把“好”的流变成“坏”。其默认参数为:ios::goodbit 故语句:cin.clear()清除cin流,并设置goodbit状态位。同理,语句:cin....

c++ cin.clear()到底是什么意思呢
当cin函数输入错误的时候,cin里面有个函数可以自动检测到输入错误,若想继续输入便要清楚掉这个错误。可以利用函数cin.rdstate()函数来读取错误的标识符看看。include <iostream>using namespace std;int main(){ int number;cin>>number;cout<<"first input"<<endl;cout<<cin.rdstate()<<endl;cin>>...

c++里面cin.clear()的意思
上面的cin默认参数为0,即无错误,正常操作.当我们输入英文字母'k'时,它的状态标识改为fail(即1),即错误,用cout对用户输出信息,再用cin.clear让错误标识改回为0,让我们可以继续输入,再清空流数据继续输入.如果我们没有了cin.clear,则会进入死循环,其过程为我们输入了英文字母,它的状态标识便为fail...

c++里cin.clear()重置输入之后,为什么还要用cin.get(),来删除输入。
cin.clear()是删除错误标记,比如goodbit,failbit,eofbit等 cin.get()是从输入流中读取一个字符,所以配合while循环可以删除输入流中的所有字符

C++ cin.ignore(),cin.clear()的讲解
clear是清除错误标志 比如你要输入一个整数int型,但是你输入了一个字符,这时候cin流中就会置一个错误标志,你再输入其他数据都会受到影响,简单的理解,流错了,咋弄都白扯(典型的错误就是你输错之后,如果是循环输入的,后面都不提示你输入了,死循环)clear就是清除这个标记,让你可以继续输入 ...

c++文件结束符
cin.clear() 函数的作用是清除全部的错误状态.cin在进入错误状态(比如说读取字符到int)之后所有的读取操作都会失败, clear()可以清除错误状态, 让cin继续工作.文件结束符, 会导致一个 fail的错误状态, 需要clear()来恢复正常 如果只是一次cin的话不用clear吧?是的, 如果接下来不需要继续使用cin了可以...

c++ 中的cin 问题?
cin.clear( );cin.ignore();\/*读到非法字符后,输入流将处于出错状态,为 了继续获取输入,首先要调用clear函数 来清除输入流的错误标记,然后才能调用 ignore函数来清除输入缓冲区中的数据。 *\/ 从我以前的代码里直接弄出来的,呵呵,终于感觉注释的好处了。希望能帮上忙,我这个是用来解决非法字符...

C++中cin.clear();cin.ignore();
\/\/cin.clear(); 如果这里没有 clear,那么下面的输入就被忽略了,因为cin标志未清除 cin.getline(str, 5);cout < <str < <endl;system( "pause ");return 0;} 如果你在调用了cin对象运算符'>>'之后需要立即调用getline()函数,那么新行字符必须从输入缓冲区中提取出来。这是通用...

c++里面的cin.clear() cin.sync() cin.ignore()这几个函数用法?_百度...
也就是当你使用默认的以回车键为结束时不需指定,系统会默认,写作cin.getline(str,);即可,你写的这个函数有问题,第二个参数是字符串长,字符串长不是第三个参数

相似回答