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

标签 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 上呢?

最佳答案

因为,当你说 getline 时,你说你想得到一行......一行是以 \n 结尾的字符串,结尾是

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

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

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

关于c++ - 为什么 cin 命令在缓冲区中留下 '\n'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28109679/

相关文章:

C++ 函数曾经工作,现在返回 0xfdfdfdfd

java - Java中的<<或>>>是什么意思?

python - eval() 函数中 '=' 上的 SyntaxError : invalid syntax, 子句

c++ - C++ 中的哪些流函数控制类的输入和输出值的格式?

java - 升级操作系统内核的方法

c++ - 清除 Bison 生成的解析器的解析器状态

c# - 如何制作具有实现两个接口(interface)的类型约束的通用集合?

c++ - 从现有指针 C++ 创建一个新对象

c++ - int a[] = {1,2,};为什么允许在初始化列表中使用尾随逗号?

c++ - 打印用户定义类型的 std::vector