这与: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
呢?
答案 0 :(得分:8)
因为,当你说getline
时,你说你想得到一条线......一条线是以\n
结尾的字符串,结尾是它的组成部分。
当您说cin >> something
时,您想要精确something
,仅此而已。终点标记不是它的一部分,因此它不被消耗。除非你有一个特殊的行类型,但标准库中没有这样的东西。
虽然没有引用标准,但这可能被视为意见,但这背后是逻辑。 他们有不同的语义。还有另一个区别getline
适用于unformatted input,而operator>>
适用于formatted input。我强烈建议阅读这些链接以获得差异。这也说它们在语义上是不同的。
另一个答案,不管是好还是不值得商榷,可以引用标准,我肯定会说,getline
行为如何,以及operator>>
对不同类型的行为如何,并说,它的作用就像这,因为标准这样说。这样做会很好,因为标准绝对定义了事物的工作方式,它可以任意地这样做......而且很少能解释设计背后的动机和逻辑。
答案 1 :(得分:4)
您没有将cin
与cin.getline
进行比较,而是将cin.operator>>
和cin.getline
进行比较,这正是这些函数定义要执行的操作。 “为什么”这个问题的答案是“按定义”。如果你想要理由,我不能把它给你。
cin.getline
读取并消费,直到输入换行符\n
为止。 cin.operator>>
不会使用此换行符。后者执行格式化输入,跳过前导空格,直到它正在读取的对象的末尾(在您的情况下,无论foo
是什么)“停止”(如果foo
是int
,当角色不是数字时)。换行是从输入行消耗的数字时剩下的。 cin.getline
读取一行,并根据定义使用换行符。
确保始终检查每个流操作的错误:
if(cin >> foo)
或
if(std::getline(cin, some_string))
注意我使用std::getline
而不是流的成员,因为这样就不需要任何幻数(代码中的100
)。