none
Visual Studio 2019 中cin.sync(); 函数无法清空输入缓冲区 RRS feed

  • 问题

  • 当输入1执行程序后。再次运行输入2 cin.sync()无法清空输入缓冲区中的回车  会跳过if (ch == '2')中getline(cin, line);

    #include<iostream>
    #include<string>

    using namespace std;

    int main() {
    string word, line;
    cout << "请选择读取字符串的方式:1表示逐次读取,2表示整行读取" << endl;
    char ch;
    cin >> ch;
    if (ch == '1')
    {
    cout << "您选择的逐次读取!";
    cout << "请输入字符串: Welcome to C++ family" << endl;
    cin >> word;
    cout << "系统读取的有效字符串是:" << endl;
    cout << word << endl;
    return 0;
    }
    //清空缓冲区
    cin.clear();
    cin.sync();
    //cin.ignore();
    if (ch == '2')
    {
    cout << "您选择的是整行读取!";
    cout << "请输入字符串: Welcome to C++ family" << endl;
    getline(cin, line);
    cout << "系统读取的有效字符是:" << endl;
    cout << line << endl;
    return 0;
    }
    cout << "您的输入有误!";
    return -1;
    cin.clear();
    cin.sync();

    }




    2021年4月10日 6:05

全部回复

  • 怎么可以查看vs关于各个函数实现的定义
    2021年4月10日 6:07
  • 你好,

    感谢您在MSDN中文论坛发帖提问。

    我建议你在这里应该使用cin.ignore。

    sync()的作用是清除输入缓冲区。

    由于程序运行时并不总是知道外部输入的进度,很难控制是不是全部清除输入缓冲区的内容。通常我们有可能只是希望放弃输入缓冲区中的一部分,而不是全部。比如清除掉当前行、或者清除掉行尾的换行符等等。但要是缓冲区中已经有了下一行的内容,这部分可能是我们想保留的。这个时候最好不要用sync()。可以考虑用ignore函数代替。

    cin.ignore(numeric_limits<std::streamsize>::max(),'/n');//清除当前行
    cin.ignore(numeric_limits<std::streamsize>::max());     //清除cin里所有内容

    关于cin.ignore和cin.sync之间的区别,我建议你可以参考这个链接:https://stackoverflow.com/a/10585440/11872808

    >怎么可以查看vs关于各个函数实现的定义

    你可以尝试右键单击类型名称,然后选择“转到定义” 或按Ctrl并单击类型名称。我建议你可以参考这个链接:https://docs.microsoft.com/en-us/visualstudio/ide/go-to-and-peek-definition?view=vs-2019

    Best Regards,

    Jeanine


    "Visual c++" forum will be migrating to a new home on Microsoft Q&A !
    We invite you to post new questions in the "Developing Universal Windows apps" forum’s new home on Microsoft Q&A !
    For more information, please refer to the sticky post.

    2021年4月13日 5:21
    版主