getline()甚至在clear()之后跳过

时间:2012-08-29 21:09:13

标签: c++ arrays char buffer getline

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

5 个答案:

答案 0 :(得分:13)

确保您没有使用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必须在第一个\n'中只读取换行符cin.getline

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

读完之后,bufor中仍然有“RETURN”字符,因此每次阅读后都必须cin.ignore()

您还可以使用cin.sync()清除信息流。 Actualy clear方法只清除标记。

还有一个选项,你可以到流的末尾,没有任何东西可以读,你应该没有问题写。

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

由你决定使用什么。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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