【问题标题】:Why does '\n' get left in the input stream, needing clearing through cin.ignore()? [duplicate]为什么 \'\\n\' 留在输入流中,需要通过 cin.ignore() 清除? [复制]
【发布时间】:2022-12-14 12:00:41
【问题描述】:
int main()
{
    string a, b;
    
    cin >> a;
    // cin.ignore(10000, '\n');
    getline(cin, b);        // in this case, it wouldn't ignore the \n, so it would just terminate without taking the input
    
    cout << a << endl;
    cout << b << endl;
}

我的问题具体是关于为什么 '\n' 留在输入流中,以及关于 cin 和 getline() 的规则,关于空格和定界符。

【问题讨论】:

  • @273K 谢谢,我想 OP 可以读取 dup
  • @j 但你是对的。空格不被视为字符串/单词的一部分。
  • cin &gt;&gt; agetline(cin, b) 对他们阅读和不阅读的内容有非常精确(而且不是很复杂)的规则。您应该熟悉它们。
  • 顺便说一句,这些规则是关于读什么和不读什么的。尽管您可能听说过,但“缓冲区”不是这些规则的任何部分。只需专注于阅读或未阅读的内容。当您进行控制台输入时,可能会出现字符可以输入但尚未读取的情况,有时称为缓冲区,但实际上并不相关。
  • ignore() 当然也是这些规则的一部分,但同样与任何缓冲区无关。

标签: c++


【解决方案1】:

原因:

使用以空格分隔的输入时(例如 int n; std::cin >> n;) 后面的任何空格,包括换行符,都将是 留在输入流上。然后当切换到面向行的输入时, 用 getline 检索到的第一行就是那个空格。 refer

解决方案:

  1. 对 getline 的显式无关初始调用
  2. 使用 std::cin 删除连续的空格 >> std::ws
  3. 忽略输入行中的所有剩余字符
  4. cin.ignore(std::numeric_limitsstd::streamsize::max(), ' ');

【讨论】:

  • 我的问题没有得到回答。特别是“为什么是' '留在溪流中?
猜你喜欢
  • 1970-01-01
  • 2014-03-08
  • 2020-08-19
  • 2014-04-26
  • 1970-01-01
  • 2017-07-19
  • 2014-10-17
  • 1970-01-01
相关资源
最近更新 更多