0

我现在正在教一个关于 cin 和 getline() 的课后俱乐部,我知道你应该在从 cin 和 getline 切换时放一个 cin.ignore() ;我也知道我们为什么要这样做,这都是有道理的。

但是.... 一个学生在 getline() 调用之后放置了 cin.ignore() 并且它仍然像他们将它放在 getline() 之前一样工作,有人知道为什么吗?

我教的和我知道的都是有效的。

string answer, line; 
cin >> answer; 
cin.ignore(); 
getline(cin, line); 

即使 cin.ignore 在 getline() 之后,什么不应该起作用,但会起作用?

string answer, line; 
cin >> answer; 
getline(cin, line); 
cin.ignore(); 
4

1 回答 1

2

请仔细阅读如何operator>>工作,以及做什么ignore()

  • 默认情况下,operator>>在提取值所需的数据之前丢弃前导空白字符。这可以用 禁用std::noskipws
  • operator>>对于整数类型,提取尽可能多的字符以将它们解释为整数。
  • operator>>对于字符串,仅提取非空白字符。读取在第一个空白字符之前停止。
  • 默认情况下,.ignore()只丢弃一个字符。
  • 要在 之后修剪一行operator>>,ignore 应该用作:.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

这会导致以下情况:

类型 输入 阅读效果 剩余输入
int 11 11
int 12 12
int 1\n 1 \n
int 1 \n 1 \n
int 13das 13 das
std::string foo “富”

line如果以多余的空格结尾,您的第一个示例将失败。

如果输入包含前导空格,或者其他被跳过的字符对读取结果没有影响(例如:+12读取时int),您的第二个示例可能会起作用。

于 2021-09-17T14:14:38.613 回答