繁体   English   中英

为什么 getline() 之前的 ignore() 少输入一个字符?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM