12

所以我有一个函数可以不断跳过第一个 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
}
4

5 回答 5

21

确保您没有使用cin >> str. 在调用函数之前。如果你使用cin >> 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);

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

于 2012-08-29T21:12:30.390 回答
1

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

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

于 2012-08-29T21:23:17.900 回答
0

在您阅读某些内容后,bufor 内仍有“返回”字符,因此您必须cin.ignore()在每次阅读后进行。

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

还有一个选项是您可以转到流的末尾,没有什么可读的,您应该毫无问题地编写。

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

您将使用什么取决于您。

于 2012-08-29T21:18:56.190 回答
0

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

于 2014-04-28T19:38:30.063 回答
0

在使用 get 行进行更大输入后,cin 会导致错误。因此,在 getline 之后使用此代码将输入队列和下降位恢复正常。

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

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

于 2021-05-15T08:58:42.660 回答