【问题标题】:getline() skipping first even after clear()getline() 即使在 clear() 之后也会先跳过
【发布时间】:2012-08-24 13:45:05
【问题描述】:

所以我有一个函数可以不断跳过第一个 getline 并直接跳到第二个 getline。我试图清除缓冲区但仍然没有运气,这是怎么回事?

void getData(char* strA, char* strB)
{
    cout << "Enter String 1: ";               // Shows this line
    cin.clear();
    cin.getline(strA, 50);                    // 50 is the character limit, Skipping Input

    cout << endl << "Enter String 2: ";       // Showing This Line
    cin.clear();
    cin.getline(strB, 50);                   // Jumps Straight to this line
}

【问题讨论】:

  • 您的控制台是否小于 50 个字符宽?我认为默认是 80

标签: c++ arrays char buffer getline


【解决方案1】:

确保您没有使用cin &gt;&gt; str。在调用函数之前。如果您使用cin &gt;&gt; str,然后想使用getline(cin, str),则必须先调用cin.ignore()

string str;
cin >> str;
cin.ignore(); // ignores \n that cin >> str has lefted (if user pressed enter key)
getline(cin, str);

如果使用 c 字符串:

char buff[50];
cin.get(buff, 50, ' ');
cin.ignore();
cin.getline(buff, 50);

添加:你的错误可能不在函数本身,而是在调用函数之前。流cin 必须在第一个cin.getline 中只读取一个换行符\n'

【讨论】:

    【解决方案2】:

    cin.clear(); 清除流上的所有错误位 - 它不消耗任何可能未决的数据。

    您想使用cin.ignore() 来使用流中的数据。

    【讨论】:

      【解决方案3】:

      在你读完之后,bufor 里面还有 'RETURN' 字符,所以你必须在每次读完之后cin.ignore()

      您也可以使用cin.sync() 清除流。 实际上 clear 方法只清除标志。

      还有一个选项,你可以去到流的末尾,没有什么要读的,你应该写没有问题。

      std::cin.seekg(0, std::ios::end);
      

      由你决定使用什么。

      【讨论】:

        【解决方案4】:

        使用cin.ignore(-1);它不会删除输入字符串的第一个字符

        【讨论】:

          【解决方案5】:

          在使用 get 行进行较大输入后,cin 会导致错误。所以在getline之后使用这段代码返回输入队列和下降位正常。

          cin.getline(a,5);
              while(getchar()!='\n');
              cin.clear();
          

          运行一个while循环以从队列中删除所有字符 cin.ignore() 导致进一步输入的问题和 cin.clear() 只是为了重置fallbit

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-11-24
            • 1970-01-01
            • 2020-08-15
            • 2015-01-02
            • 2017-10-01
            • 2019-09-12
            • 2011-07-16
            相关资源
            最近更新 更多