【问题标题】:Is this a bug with getline(), or am I doing something wrong. Right way to use getline()?这是 getline() 的错误,还是我做错了什么。使用 getline() 的正确方法?
【发布时间】:2012-06-24 01:57:41
【问题描述】:

这可能不是错误,但我不知道出了什么问题。 我的第一个条目在第二次迭代中为 str1 重复,并且从那时起是相同的方式。只有第一次迭代顺利。

#include <iostream>
#include <string>
using namespace std;

int main () {

cout << " \n Enter two words. \n " ;
char c = 'y';
string str;
string str1;
while (c == 'y'){

    getline(cin,str);

    getline (cin,str1);

    cout << " \n\n str : " << str << " str1 : " << str1 ;
    cout << " \n Continue ? \n " ;
    cin >> c;
}

return 0;
}

输出是:

输入两个字。 你好世界 这是先生 str : 你好世界 str1 : 这是先生 继续 ? 是的 你好世界 str : str1 : 你好世界 继续 ? n

【问题讨论】:

  • 按下 y 后,您可能会按 Enter。您应该考虑按 Enter 键时读取换行符的程序的哪个部分。
  • @chris cin 是一个对象,也许你的意思是操作员>>
  • 欢迎来到 SO!感谢您提供一个完整的简短程序来演示您的问题。这对您来说非常很有帮助。请参阅sscce.org 了解更多信息。
  • @Robᵩ 我一直在浏览 Stackoverflow,已经有一段时间了,(这是我的第一个问题)。它总是有帮助的,这是我犯的一个棘手的错误,sn-p 可能节省了数小时的头部抨击和敲击 Enter 键......

标签: c++ istream


【解决方案1】:

添加

cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );

在你之后

cin >> c;

考虑以下输入:

    dog
    cat
    y
    owl
    fish
    n

如果我们单独检查输入流中存在的字符,我们会看到:

    d o g \n c a t \n y \n o w l \n f i s h \n n \n

第一次调用getline 消耗dog\n;第二个消耗cat\n,留下这个:

    y \n o w l \n f i s h \n n \n

第一次调用cin &gt;&gt; c 只消耗y 但不消耗后续的换行符,留下这个:

    \n o w l \n f i s h \n n \n

现在,有趣的事情开始了:在下次调用 getline 时会发生什么?当然,为什么它会读到下一个换行符。所以下一次对getline 的调用会返回一个空行,并将owl... 留在输入流中。

如上所述,解决方案是消耗(现在无用的)输入行的剩余部分。

【讨论】:

  • 谢谢,我也是这么想的。你替我确认了。至于解决方案,我正在使用 ignore() 清除 cin 缓冲区。仍然没有用。因为,我把它放在错误的位置,即在 cin >> c 之前。 (它是项目的一部分,所以在我接受选择之前还有一个cin>>年。)
【解决方案2】:

正如罗伯所说。

但是看起来更好的替代修复:

// change
char c = 'y';
....
while (c == 'y'){
....
    cin >> c;

// Into
std::string c = "y";
....
while (c == "y"){
....
    std::getline(cin, c);

在处理手动用户输入时,您应该小心使用 >> 运算符,因为这将始终在输入中留下 '\n'。这意味着您可以使用检索 '\n' 字符的方法 (getline()),也可以手动将其删除 (ignore())。

【讨论】:

  • 谢谢,看看这个 sn-p 我找到了正确的位置来忽略() cin。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多