何时使用空白的cin.get()?

时间:2018-10-28 10:45:36

标签: c++

正如标题所述-什么时候应该使用空白的cin.get()?

我遇到了程序表现异常的情况,直到我在阅读行之间添加了一些空白的cin.get()为止。 (例如,在读取其字段的结构中,我必须在每个非空白的cin.get()之间输入cin.get())

那么空白的cin.get()有什么作用,什么时候应该使用它? 谢谢。

1 个答案:

答案 0 :(得分:0)

流输入操作分为两大类:格式化的和未格式化的。格式化的操作期望以特定形式输入;他们首先跳过空格,然后寻找与期望内容匹配的文本。它们通常被写为提取器;那就是您经常看到的>>

int i;
std::cin >> i; // formatted input operation

在这里,提取器正在寻找数字,并将其看到的数字转换为整数值。当它看到不是数字的东西时,便停止寻找。

未经格式化的输入操作仅会执行某些操作,而不考虑有关输入外观的任何规则。 basic_istream::get()是其中之一:它仅读取一个字符或一个字符序列。如果您要求它读取一个序列,则它并不关心该序列中的内容,只是采用分隔符的形式会查找该分隔符。除此之外,它只是复制文本。

当您混合格式化和未格式化的操作时,它们会互相影响。

int i;
std::cin >> i;

如果std::cin正在从控制台中读取(也就是说,您尚未在命令行上将其重定向),则通常会键入一些数字,然后按“ Enter”键。提取器读取数字,当它碰到换行符时(这就是输入时的“ Enter”键的样子),它将停止读取,而只保留换行符。没关系,如果对该流的下一个操作也是格式化的提取器:它将跳过换行符和任何其他空格,直到遇到非空格,然后开始将文本转换为适当的值。

但是,如果您先使用格式化操作,然后再进行未格式化操作,则会出现问题。当人们将提取器(>>)与getline()混合在一起时,这是一个常见的问题:提取器读取换行符,而对getline()的调用读取换行符,说:“嘿,我'有一个空行”,并返回一个空字符串。

basic_istream::get()的版本相同,它读取一个字符序列:当它到达定界符时(如果未指定其他内容,则换行),它将停止读取。如果该换行符是紧接在前的格式化提取器的剩余字符,则可能不是您要找的内容。

一种(真的很丑)的解决方法是蛮力cin.ignore(256, '\n');,它最多可以忽略256个连续换行符。

一个更精致的解决方案是首先不要制造问题。如果需要阅读行,请阅读行。如果您需要阅读行,有时需要从行中的文本中提取值,请阅读行,然后创建一个std::stringstream对象并从中提取。