为什么getline()在cin.clear()之后仍然跳过输入?

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
}

你的控制台宽度是否小于50个字符?默认值是80,我想。 - huseyin tugrul buyukisik
5个回答

23

请确保在调用函数之前没有使用 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-strings的情况下:

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

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


1

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

您需要使用cin.ignore()来消耗流中的数据。


0

在使用getline读取较大输入后,再使用cin会导致错误。因此,在调用getline后使用以下代码将输入队列和故障位(fall bit)恢复为正常状态。

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

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


0

在读取完内容后,缓冲区中仍然存在“RETURN”字符,因此您需要在每次读取后使用cin.ignore()

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

还有一种选项,即您可以到达流的末尾,没有剩余可读内容,您应该可以无问题地进行写入。

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

你可以自由选择使用什么。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接