getline() 即使在 clear() 之后也会先跳过

Posted

技术标签:

【中文标题】getline() 即使在 clear() 之后也会先跳过【英文标题】:getline() skipping first even after 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 【参考方案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

【讨论】:

以上是关于getline() 即使在 clear() 之后也会先跳过的主要内容,如果未能解决你的问题,请参考以下文章

即使我使用字符串空格,也使用 >> 和 getline 获取空输出

cin 详解(get()getline()clear()sync())

在 getline(cin, string) 之后使用 cin

getline(cin,_string);

调用 clear() 后,vector 的元素仍然可以引用吗?

在 getline 之后在 C++ 中输入