getline忽略了字符串输入的第一个字符。

5

C++的getline函数为什么会忽略输入的第一个字符?

这篇文章中,罪魁祸首是cin.ignore()函数,但我在我的代码中没有使用cin.ignore()函数。

以下是我尝试做的非常基本的示例:

#include <iostream>
#include <string>

using namespace std;

int main(){

    string user_input;

    cout << "input: ";
    cin >> user_input;
    getline(cin,user_input);

    cout << "length: " << user_input.length() << endl;
    cout << "your input: " << user_input << endl;

    return 0;
}

问题是,输出结果完全错误:
input: 1 2 3
length: 4
your input:  2 3

显然,字符串的长度应该包括空格,应为5而不是4。您还可以看到user_input的第一个字符丢失了。
有人能解释一下为什么这段代码给出错误的输出以及我需要做什么来解决这个问题吗?我从未处理过包含空格的字符串。我很好奇是什么导致了这个问题的出现! :)

4
你没有用cin>>user_input读取第一个数字吗? - andand
4个回答

3
cin >> user_input;

我不确定你为什么把那行代码放在那里,但它从cin读取并消耗第一个以空格分隔的字符串。所以它读取了1。之后,getline读取剩下的行,即" 2 3"


3

cin >> user_input 是罪魁祸首。它会获取输入直到第一个空格。删除这行代码,只使用 getline(cin,user_input) 就可以解决问题了。


啊,好的。谢谢你向我解释。很有趣。是我犯了一个愚蠢的错误。 - user2371809

3

cin >> user_input; 会吃掉第一个数字,然后 getline() 获取剩余的输入。如果删除 cin >> user_input;,它应该可以正常工作。


-1

只需删除这一行 cin >> user_input;,你的代码就可以正常工作了。


为什么要转载几年前已经发布的现成答案呢?这并没有增加任何新内容。 - Blastfurnace

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