为什么 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>>
对不同类型的行为方式,然后说,它像这样工作,因为标准是这样说的。这很好,因为该标准绝对定义了事物的工作方式,并且可以任意定义...而且它很少解释设计背后的动机和逻辑。
您不是在比较 cin
和 cin.getline
,而是在比较 cin.operator>>
和 cin.getline
,而这正是定义这些函数的目的。 "why" 问题的答案是 "by definition"。如果你要理由,我给不了你。
cin.getline
读取并消耗直到输入换行符 \n
。 cin.operator>>
不消耗这个换行符。后者执行格式化输入,跳过前导空格,直到它正在读取的对象的末尾(在你的情况下 foo
是什么)"stops"(如果 foo
是 int
,当字符不是数字时)。换行符是从输入行中消耗数字时剩下的内容。 cin.getline
读取一行,并根据定义使用换行符。
确保始终检查每个流操作的错误:
if(cin >> foo)
或
if(std::getline(cin, some_string))
注意我使用 std::getline
而不是流的成员,因为这样就不需要任何幻数(代码中的 100
)。
这与以下相关: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>>
对不同类型的行为方式,然后说,它像这样工作,因为标准是这样说的。这很好,因为该标准绝对定义了事物的工作方式,并且可以任意定义...而且它很少解释设计背后的动机和逻辑。
您不是在比较 cin
和 cin.getline
,而是在比较 cin.operator>>
和 cin.getline
,而这正是定义这些函数的目的。 "why" 问题的答案是 "by definition"。如果你要理由,我给不了你。
cin.getline
读取并消耗直到输入换行符 \n
。 cin.operator>>
不消耗这个换行符。后者执行格式化输入,跳过前导空格,直到它正在读取的对象的末尾(在你的情况下 foo
是什么)"stops"(如果 foo
是 int
,当字符不是数字时)。换行符是从输入行中消耗数字时剩下的内容。 cin.getline
读取一行,并根据定义使用换行符。
确保始终检查每个流操作的错误:
if(cin >> foo)
或
if(std::getline(cin, some_string))
注意我使用 std::getline
而不是流的成员,因为这样就不需要任何幻数(代码中的 100
)。