• cin.sync()函数


    这个是用来清空cin缓冲区里面未读取的信息...
    
    例子: 
    #include <iostream>
    using namespace std;
    
    int main () {
      char first, second;
    
      cout << "Please, enter a word: ";
      first=cin.get();
      cin.sync();
    
      cout << "Please, enter another word: ";
      second=cin.get();
    
      cout << "The first word began by " << first << endl;
      cout << "The second word began by " << second << endl;
    
      return 0;
    }
    
    样例输入:
    you
    me
    
    样例输出:
    The first word began by y
    The second word began by m
     
    以下为扩展内容了:cin.clear
    #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()一起用

  • 相关阅读:
    画架构图
    做产品的方方面面
    Tomcat一个有意思的漏洞
    LinkedHashMap 作为一个 CacheMap
    Maven提高篇系列之五——处理依赖冲突
    javaweb获取项目路径的方法
    curl工具介绍和常用命令
    Spring事务管理(详解+实例)
    如何更好地使用Java 8的Optional
    input的type=file触发的相关事件
  • 原文地址:https://www.cnblogs.com/qingcheng/p/2251529.html
Copyright © 2020-2023  润新知