为什么 cin 命令在缓冲区中留下一个 '\n'?

Why does cin command leaves a '\n' in the buffer?

这与以下相关:cin and getline skipping input但他们不回答为什么会发生,只回答如何解决。

为什么 cin 会在缓冲区中留下一个 '\n' 而 cin.getline 会接受它?

例如:

cin >> foo;
cin >> bar;//No problem
cin >> baz;//No problem.

但是 cin.getline

cin >> foo;
cin.getline(bar,100);//will take the '\n'

那么为什么 cin 不会发生而 cin.getline 会发生?

因为,当你说getline时,你说你想要一行...一行是以\n结尾的字符串,结尾是它的组成部分。

当您说 cin >> something 时,您只想得到 something,仅此而已。结束行标记不是它的一部分,所以它不会被消耗掉。除非你有一个特殊的线类型,但标准库中没有这样的东西。

虽然没有引用标准,这可能被视为意见,但这是其背后的逻辑。 它们具有不同的语义。还有一个区别getline works as unformatted input, and operator>> works as formatted input。我强烈建议阅读这些链接以了解差异。这也说明它们在语义上是不同的。

另一个答案,无论好坏,都值得商榷,我肯定会引用标准,getline 的行为方式,以及 operator>> 对不同类型的行为方式,然后说,它像这样工作,因为标准是这样说的。这很好,因为该标准绝对定义了事物的工作方式,并且可以任意定义...而且它很少解释设计背后的动机和逻辑。

您不是在比较 cincin.getline,而是在比较 cin.operator>>cin.getline,而这正是定义这些函数的目的。 "why" 问题的答案是 "by definition"。如果你要理由,我给不了你。

cin.getline 读取并消耗直到输入换行符 \ncin.operator>> 不消耗这个换行符。后者执行格式化输入,跳过前导空格,直到它正在读取的对象的末尾(在你的情况下 foo 是什么)"stops"(如果 fooint,当字符不是数字时)。换行符是从输入行中消耗数字时剩下的内容。 cin.getline 读取一行,并根据定义使用换行符。

确保始终检查每个流操作的错误:

if(cin >> foo)

if(std::getline(cin, some_string))

注意我使用 std::getline 而不是流的成员,因为这样就不需要任何幻数(代码中的 100)。