【发布时间】:2015-01-23 12:14:10
【问题描述】:
这与: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 会发生这种情况?
【问题讨论】:
-
foo、bar和baz的类型是什么?你试过玩skipws吗? -
cin不是命令。它是std::ostream类型的对象。相反,>>是std::ostream::operator>>,即。 e.操作员(仍然不是“命令”)。它将换行符留在缓冲区中,因为 C++ 标准规定此运算符必须将换行符留在缓冲区中。std::getline()不会将它留在缓冲区中,因为规范说它必须使用换行符。这就是为什么。 -
每个人都知道为 C++ 标准库贡献 STL 的人的名字。没有人知道是谁创建了 iostream。如果我是 Jerry Schwarz,那么我也更愿意保持这种状态:)
-
@HansPassant 你是认真的吗?
-
好吧,去看看 lolz,但有一个真理的核心。我认为没有任何 C++ 程序员对 iostream 的结果印象深刻。这肯定是有原因的,Schwartz 必须使用早期设计,这些设计可以追溯到世界仍然使用 C 和 C++ 还没有异常和多重继承的时代。很难猜出他必须使用什么样的约束才能避免破坏大量现有代码。你的问题有什么问题,只有施瓦茨能准确回答。