我们先来谈谈cin.clear的作用,第一次看到这东西,很多人以为就是清空cin里面的数据流,而实际上却与此相差很远,首先我们看看以下代码:

#include <iostream> 
using namespace std;

int main() 

int a; 
cin>>a; 
cout<<cin.rdstate()<<endl; 
if(cin.rdstate() == ios::goodbit)
{
cout<<"输入数据的类型正确,无错误!"<<endl; 

if(cin.rdstate() == ios_base::failbit) 

cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl; 

system("pause"); 
}

我们定义要输入到的变量是整型,但如果我们输入了英文字母或者汉字,那就会发生错误,cin里有个方法能检测这个错误,就是cin.rdstate();
当cin.rdstate()返回0(即ios::goodbit)时表示无错误,可以继续输入或者操作,若返回4则发生非致命错误即ios::failbit,则不能继续输入或操作.而cin.clear则可以控制我们此时cin里对这个问题的一个标识.语发如下:
cin.clear(标识符);
标识符号为:

goodbit 无错误 
Eofbit 已到达文件尾 
failbit 非致命的输入/输出错误,可挽回 
badbit 致命的输入/输出错误,无法挽回 
若在输入输出类里.需要加ios::标识符号 
通过cin.clear,我们能确认它的内部标识符,如果输入错误则能重新输入.结合真正的清空数据流方法cin.sync(),请看下例:

#include <iostream> 
using namespace std;

int main() 

int a; 
while(1) 

cin>>a; 
if(!cin) //条件可改写为cin.fail() 

cout<<"输入有错!请重新输入"<<endl; 
cin.clear(); 
cin.sync(); //清空流

else 

cout<<a; 
break; 


system("pause"); 
}

上面的cin默认参数为0,即无错误,正常操作.当我们输入英文字母'k'时,它的状态标识改为fail(即1),即错误,用cout对用户输出信息,再用cin.clear让错误标识改回为0,让我们可以继续输入,再清空流数据继续输入.如果我们没有了cin.clear,则会进入死循环,其过程为我们输入了英文字母,它的状态标识便为fail,当运行到条件判断时,便总是回到错误的条件表示里,并且我们再也没办法输入,因为错误的表示关闭了cin,所以会进入死循环.

---------------------------------------------------------------------

自己再添加一句:如果输入错误,则再也输入不进去,须用clear.而sync用于清除当前输入缓冲区中的内容。

#include <iostream>

int main()
{
using namespace std;

int a; 
cin >> a;
cout << a <<endl;
cin >> a ;
cout <<a <<endl;
cin.clear();
cin.sync(); // 可以将cin.clear();cin.sync(); 不同时注释掉试一下就知道了
cin >> a;
cout <<a <<endl;

return 0;

}

cin.sync(); // 这个函数是用来清空缓冲区的

cin.clear();的错误是清楚错误标志
例如一下程序
#include <iostream>
using namespace std;

int main()
{ int a,b;
cin>>a;
cin>>b;

return 0;
}
假如,运行都cin>>a时要求输入,这是输入的是一个字符。
这样,和a的类型不符合,cin的状态就标志为错误,因为cin的状态为错误,以后的cin>>都不会被执行。

可能你有疑问,“是不是在cin>>b前加个cin.clear(),cin>>b就可以执行”。
答案是不是的,因为在第一次输入字符时候cin>>a;因为类型不符合,就不会从输入流中提取数据,也就是说,输入流中,上一次输入的字符仍然存在。
那么我们可以使用cin.sync()来清空输入流。

cin>>a;
cin.clear();
cin.sync();
cin>>b;

总之,cin.clear()一般要和cin.sync()一起用

希望能帮到你,呵呵O(∩_∩)O~

cin输入bug的更多相关文章

  1. C++中cin输入问题

    场景:cin输入一个整数,但是在console输入了其他如字符,字符串.当判断输入错误再重新输入时[ 如while()内重复判断知道输入格式正确 ],可能进入死循环. 解释:console输入时所按的 ...

  2. C++中cin输入类型不匹配解决方法

    #include <iostream> #include <set> using namespace std; int main() { int a; cin>>a ...

  3. getline(cin,s) bug workaround

    #include<iostream>using namespace std;#include<string> int main(){int n;stirng s;cin> ...

  4. 关于"cin>>"输入成功或失败时的“返回值”(转载)

    今天在看c++primer的时候,读到其中这样一段话: When we use an istream as a condition, the effect is to test the state o ...

  5. 一个C++程序中有多个cin输入的情况

    在很多C++程序中,我们都会有几次输入的操作.这种情况下,会遇到只有第一个cin语句被执行了,而后面的cin都没有执行.这是因为cin所输入的数据都放在cin缓冲区中,当第一次使用cin后,缓冲区中已 ...

  6. getchar(),scanf(),gets(),cin,输入字符串

    #include<iostream>#include<stdio.h>#include<string.h>#include<string>using n ...

  7. C++利用cin输入时检测回车的方法

    今天做TJU的OJ ,其中一道题是先读入一个字符串,再读入一个整数,循环往复,直到字符串是空,也就是说回车键结束循环. 但是cin对空格和回车都不敏感,都不影响继续读入数据,所以需要一种新的方式检测回 ...

  8. 修复CefSharp浏览器组件中文输入Bug

    概述 最近在win10上开发wpf应用,需要将CefSharp中wpf版本的浏览器组件(版本号v51.0.0)嵌入到应用中,但是发现不支持中文输入,GitHub上有这个问题的描述,参照其提到的方法可以 ...

  9. C++正确的cin输入

    void test1(void) { int number; cout << ">> pls input a integer number:"; while ...

随机推荐

  1. Kowala协议:一组分布式,自我调节,资产跟踪特性的加密货币(二)

    对于稳定币来言,设计过程中会遇到很多细节的问题,今天来讲述下有关通证设计过程中的一些问题. 1.计算手续费 计算费是交易费的一部分,转移给kUSD矿工,并由以下公式决定: 其gasUsed(t) 是用 ...

  2. [UE4]控件模板

    控件模板:一个UI可以作为另外一个UI的子控件,这个子控件就是控件模板. 控件模板一般使用“Size Box”组件作为根节点,给“Size Box”组件设置合适的尺寸,显示模式选择“Desired”, ...

  3. C++ Templates编程(模板参数)

    //file max.hpp template <typename T> //template<class T> inline T const& max (T cons ...

  4. system 系统调用、gcc编译过程

    system 库函数的功能是执行操作系统的命令或者运行指定的程序 #include <stdio.h> #include <stdlib.h>//引入库 int main() ...

  5. Java - 32 Java 多线程编程

    Java 多线程编程 Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特别 ...

  6. TP5实现邮件发送(PHP 利用QQ邮箱发送邮件「PHPMailer」)

    在 PHP 应用开发中,往往需要验证用户邮箱.发送消息通知,而使用 PHP 内置的 mail() 函数,则需要邮件系统的支持. 如果熟悉 IMAP/SMTP 协议,结合 Socket 功能就可以编写邮 ...

  7. python-性能测试

    目录: 1.timeit 1.1 在命令后调用timeit 1.2 在代码中使用 1.3 创建计时器实例,通过autorange获得循环次数 1.4 Wall时间和CPU时间 2.profile和cP ...

  8. CentOS7离线安装Ambari与HDP

    安装步骤总体说明 1.安装以前需要先规划服务器,一台主机多台从机.主从需要设置时间同步和免密. 2.建立离线源,因在线安装速度很慢,所以需要建立离线源. 3.在主机上安装Ambari,进入系统后,挂接 ...

  9. SVN提交报错(SVN的bug)

    提交的时候报错: Failed to execute WebDAV PROPPATCHsvn: Commit failed (details follow):svn: At least one pro ...

  10. bayes公式 - 再从零开始理解

    bayes公式与机器学习 - 再从零开始理解 从本科时候(大约9年前)刚接触Bayes公式,只知道P(A|B)×P(B) = P(AB) = P(B|A)×P(A) 到硕士期间,机器学习课上对P(B| ...