【发布时间】:2022-01-05 07:42:09
【问题描述】:
作为参考,我已经看过Why does std::getline() skip input after a formatted extraction?
我想了解 cin 和 getline 行为。我想象 cin 和 getline 将通过输入缓冲区上的循环来实现,每次迭代都会增加一个游标。一旦输入缓冲区的当前元素等于某个“停止”值(cin 为“”或“\n”,getline 为“\n”),循环就会中断。
我的问题是 cin 和 getline 的阅读行为之间的区别。使用 cin,它似乎停在“\n”,但它会在退出循环之前增加光标。例如,
string a, b;
cin >> a;
cin >> b;
cout << a << "-" << b << endl;
// Input: "cat\nhat"
// Output: "cat-hat"
所以在上面的代码中,第一个 cin 一直读到“\n”。一旦它击中“\n”,它就会在中断循环之前将光标增加到下一个位置“h”。然后,下一个 cin 操作从“h”开始读取。这允许下一个 cin 实际处理字符,而不仅仅是中断。
当 getline 与 cin 混合时,这不是行为。
string a, b;
cin >> a;
getline(cin, b);
cout << a << "-" << b << endl;
// Input: "cat\nhat"
// Output: "cat-"
在本例中,cin 读取到“\n”。但是当 getline 开始读取时,它似乎是从“\n”而不是“h”读取的。这意味着光标没有前进到“h”。所以 getline 处理了 "\n" 并将光标前进到 "h" 但实际上并没有将 getline 保存到 "b"。
因此,在一个示例中,cin 似乎将光标推进到“\n”,而在另一个示例中,它没有。 getline 也表现出不同的行为。例如
string a, b;
getline(cin, a);
getline(cin, b);
cout << a << "-" << b << endl;
// Input: "cat\nhat"
// Output: "cat-hat"
现在 getline 实际上将光标移到“\n”上。为什么会有不同的行为? cin 与 getline 在分隔符方面的实际实现是什么?
【问题讨论】:
-
"所以在一个例子中,cin 似乎将光标推进到 "\n",而在另一个例子中,它没有。"不,在这两种情况下都不是。默认情况下,使用
operator>>从cin读取会跳过前导 空格,而不是尾随空格。由于您的帐户已超过 8 年并且您有多个金徽章,您现在应该了解expectation for research。像这样的问题是easily answered 与搜索引擎。 -
哦,有趣。但是如果cin能够区分前导和后缀“\n”,那么为什么getline不跳过前导“\n”
-
cin和getline()没有表现出不同的行为。getline()和格式化提取(使用运算符<<)都与流交互,您所看到的是它们与cin(和任何流)的交互方式不同。他们这样做是因为它们的指定方式不同。operator<<()跳过空白,读取值(如果可以),并在到达空白时停止。getline()(默认情况下)一直读取,直到遇到换行符 - 并丢弃换行符。同时使用它们可能会导致与某些用户输入发生意外交互。
标签: c++ whitespace iostream cin getline