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

shi*_*zou 6 c++ syntax

这与以下内容有关:cin和getline跳过输入但是他们没有回答为什么它只是如何修复它.

为什么cin在缓冲区中留下'\n'但只是cin.getline需要它?

例如:

cin >> foo;
cin >> bar;//No problem
cin >> baz;//No problem.
Run Code Online (Sandbox Code Playgroud)

但随着 cin.getline

cin >> foo;
cin.getline(bar,100);//will take the '\n'
Run Code Online (Sandbox Code Playgroud)

那么为什么它不会发生,cin但它确实如此cin.getline

luk*_*k32 8

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

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

虽然没有引用标准,但这可能被视为意见,但这是它背后的逻辑.它们有不同的语义.也有另一种差异getline可以作为无格式输入,并operator>>可以作为格式化的输入.我强烈建议阅读这些链接以获得差异.这也说它们在语义上是不同的.

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


rub*_*nvb 6

你是不是比较cincin.getline,而是cin.operator>>cin.getline,这正是这些功能被定义为做。“为什么”这个问题的答案是“根据定义”。如果你想要理由,我不能给你。

cin.getline读取和消耗直到\n输入换行符。cin.operator>>不消耗这个换行符。后者执行格式化输入,跳过前导空格,直到它正在读取的对象结束(在您的情况下,无论foo是什么)“停止”(如果foo是 an int,当字符不是数字时)。换行符是从输入行消耗数字时剩余的内容。cin.getline读取一行,并根据定义使用换行符。

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

if(cin >> foo)
Run Code Online (Sandbox Code Playgroud)

或者

if(std::getline(cin, some_string))
Run Code Online (Sandbox Code Playgroud)

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