这是getline()的错误,还是我做错了什么。使用getline()的正确方法?

时间:2012-06-21 18:51:42

标签: c++ istream

这可能不是一个错误,但我不知道出了什么问题。 我在第二次迭代时对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;
}

输出结果为:

 Enter two words.
 hello world
this is mr


 str : hello world str1 : this is mr
 Continue ?
 y
hello world


 str :  str1 : hello world
 Continue ?
 n


2 个答案:

答案 0 :(得分:3)

添加

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 >> c的第一次通话仅消耗y ,但不会消耗后续换行,只留下:

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

现在,乐趣开始了:下一次调用getline时会发生什么?当然,为什么它会读到下一个换行符。因此,下一次调用getline会返回一个空行,并在输入流中留下owl...

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

答案 1 :(得分:1)

正如抢劫所说。

但另一种看起来更好的替代方案:

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

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

处理手动用户输入时,请注意使用&gt;&gt;因为这将始终离开&#39; \ n&#39;在输入上。这意味着你可以使用一种方法来检索&#39; \ n&#39; character(getline())或者你可以在之后手动删除它(ignore())。