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

Posted

技术标签:

【中文标题】getline 忽略字符串输入的第一个字符【英文标题】:getline ignores first character of string input 【发布时间】:2015-06-10 19:41:03 【问题描述】:

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

在this post 中,罪魁祸首是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 的第一个字符丢失了。

谁能向我解释为什么这段代码给出了错误的输出以及我需要做什么来解决这个问题?我从来没有使用过包含这样的空格的字符串。我很好奇是什么导致了这个问题的出现! :)

【问题讨论】:

你不是用cin&gt;&gt;user_input消费了第一个号码吗? 【参考方案1】:

cin &gt;&gt; user_input; 正在吃第一个数字。然后getline() 出现并获取其余的输入。删除cin &gt;&gt; user_input;,它应该可以正常工作。

【讨论】:

【参考方案2】:
cin >> user_input;

我不知道你为什么把那行放在那里,但它会读取并使用来自cin 的第一个空格分隔的字符串。所以它读取 1。之后,getline 读取该行的其余部分,即" 2 3"

【讨论】:

【参考方案3】:

cin &gt;&gt; user_input 是罪魁祸首。它一直在抓取输入,直到第一个空格摆脱那行代码,您应该只使用getline(cin,user_input)

【讨论】:

啊,好的。谢谢你向我解释。那很有意思。我犯了一个愚蠢的错误。

以上是关于getline 忽略字符串输入的第一个字符的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 for 循环中潜在的 getline() 问题,数组的第一个索引未显示? [复制]

string 类型的输入操作符 cin 和 getline 函数分别如何处理空白字符?

练习3.3

如何在第一个字符输入后忽略所有内容

1040 有几个PAT (fgets,getline)

如何强制getline()一次输入一行[重复]