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

时间:2015-01-23 12:14:10

标签: c++ syntax

这与: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呢?

2 个答案:

答案 0 :(得分:8)

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

当您说cin >> something时,您想要精确something,仅此而已。终点标记不是它的一部分,因此它不被消耗。除非你有一个特殊的行类型,但标准库中没有这样的东西。

虽然没有引用标准,但这可能被视为意见,但这背后是逻辑。 他们有不同的语义。还有另一个区别getline适用于unformatted input,而operator>>适用于formatted input。我强烈建议阅读这些链接以获得差异。这也说它们在语义上是不同的。

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

答案 1 :(得分:4)

您没有将cincin.getline进行比较,而是将cin.operator>>cin.getline进行比较,这正是这些函数定义要执行的操作。 “为什么”这个问题的答案是“按定义”。如果你想要理由,我不能把它给你。

cin.getline读取并消费,直到输入换行符\n为止。 cin.operator>>不会使用此换行符。后者执行格式化输入,跳过前导空格,直到它正在读取的对象的末尾(在您的情况下,无论foo是什么)“停止”(如果fooint,当角色不是数字时)。换行是从输入行消耗的数字时剩下的。 cin.getline读取一行,并根据定义使用换行符。

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

if(cin >> foo)

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

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