![](/img/trans.png)
[英]Why does using two getline function together, second one doesn't take the \n character?
[英]Why does ignore() before getline() take one less character input?
我在C++中使用了getline()
function,但是出现了从第二个字符开始输入的问题。 我使用ignore()
function 首先擦除缓冲区中剩余的内容,清空缓冲区并接收输入。 如何清空缓冲区并正确接收输入?
以上是执行结果。 我之前使用ignore()
function 和getline()
function 来清空缓冲区并接收输入,因为之前缓冲区中可能有一些剩余。
在其他这样写的程序中,它之前也接收到 integer 输入。
void InputValue(string *st) {
//cin.clear();
cin.ignore();
getline(cin, *st);
}
int main(void) {
string str;
InputValue(&str);
cout << str;
return 0;
}
一开始,在输入之后, stdin
(您的输入缓冲区)立即包含:
abcd
这些角色正在等待以您选择的任何方式提取。 由于您正在使用stdin
中的getline()
从标准输入(使用std::cin
)读取到std::string
,因此getline()
将消耗该行中的所有字符,读取并丢弃尾随'\n'
和所有字符存储在您的std::string
中。 stdin
中没有剩余字符需要使用std::cin.ignore()
提取
当您在getline()
)之前调用std::cin.ignore()
时,您正在读取(并丢弃)等待在stdin
中读取的第一个字符。 对于上面的示例字符,在调用std::cin.ignore()
并提取和丢弃字符后,以下内容留在stdin
中:
bcd
所以现在当你调用getline (std::cin, *st);
"bcd"
是唯一可用的字符。 这就是您错过第一个角色的原因。
虽然您可以std::cin.ignore()
一个字符,但.ignore()
成员 function 通常用于使用以下形式读取/丢弃一行中的所有剩余字符
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
其中#include <limits>
提供表示指定类型的最大数量的常量,在<std::streamsize>::max()
之上(例如size_t
可以表示的最大值)。 一个大常量用于确保该行的剩余部分,无论多长,都被消耗和丢弃,留下std::cin
为空或下一行(在多行缓冲区中)的第一个字符等待读取.
std::basic_istream::ignore也可以读取最多一个定界符,读取/丢弃少于整行。 这在读取分隔的字段时很有用,或者在您将定界符与getline()
一起使用以读取少于整行的情况下。
您可以先执行读取操作,然后调用ignore()
将不需要的字符丢弃到行尾,或者您可以先使用指定数量的字符(默认1
)或分隔符调用ignore()
以丢弃开头一行的一部分,直到您想要开始阅读的第一个字符。
正如您在上面使用的那样,它只会截断用户输入的任何内容的第一个字符——这似乎不是您想要的。 事实上,上面甚至不需要ignore()
。 去掉看看go丢字符的问题是不是消失了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.