cin.ignore() 究竟是做什么的?

3
我被我的教授告知,每当我使用`cin`时,都应该紧随其后使用`cin.ignore(100, '\n')`。但是,我从未理解为什么?下面是一个例子:
const int MAX = 200;
char input[MAX];

cout << "Enter something: ";
    cin.get(input, MAX);
    cin.ignore(100, '\n'); //why necessary?!!

@M.M 那 100 怎么办? - Obeguistake61
1
@Obeguistake61 应该是 std::numeric_limits<std::streamsize>::max() - Weak to Enuma Elish
希望您在按下Enter键之前,没有在MAX后面输入超过100个字符的垃圾内容...正如其他人所指出的那样,它应该是正确类型的最大可能整数。 - M.M
1
一种不需要指定大小的替代方法是 char ch; while (cin.get(ch) && ch != '\n'); - M.M
它是做什么的?它从输入流中读取并丢弃,直到找到行末尾'\n'或已经丢弃了100个字符,以先到者为准。正是每个人都在警告你的那个先到者部分。std::numeric_limitsstd::streamsize::max()是流中可以存在的绝对最大量,因此它几乎可以保证您会先找到行末尾。 - user4581301
显示剩余3条评论
2个回答

5
您不需要每次都使用 ignore,但在格式化输入后或像您这样只读取指定数量的情况下使用是很好的选择。
在您的示例中,如果我键入超过 200 个字符,任何未来的输入可能会出现问题。
char input[200];
std::cin.get(input, 200);

执行完这个操作后,前200个字符被提取出来,但其余内容仍留在流中。它也会保留其中的换行符('\n')。如果要在此之后再次提取输入,它将读入我们先前输入剩余的字符。
格式化输入也会出现此情况。以以下示例为例:
int age;
std::string name;
std::cin >> age;
std::getline(std::cin, name);

你想输入一个年龄,比如32,和一个名字,比如“Bob”。实际上,当你输入年龄时,程序会跳过读取名字的步骤。当std::cin使用>>读取变量时,它会留下由于按回车键而放入流中的'\n'字符。然后,getline会读取该换行符并停止,因为它遇到了一个换行符并认为它已经完成任务。 ignore通过丢弃包括下一个换行符在内的所有内容来解决这个问题,以便额外的输入不会影响未来的读取。
std::cin.ignore(std::numeric_limits<std::streamsize>::max());

0

cin.ignore(100, '\n');

这个函数会忽略前100个字符,但如果在忽略100个字符之前遇到了'\n',函数将停止丢弃字符。因此我认为你的教授希望你忽略行上剩余的数据,除非它超过100个字符。


1
将假设改为“忽略行中的其余数据”,那么你就正确了。 - user4581301
谢谢。为什么你在评论区回答了这个问题? - acheigrec
1
将假设更改为“忽略行上除长度超过100个字符的数据以外的所有数据”。 - Neil Kirk
@NeilKirk 我从未暗示这个假设是正确的,只是讲述了教练似乎假定了这一点。我将把这视为又一个教训,说明为什么在互联网上不应该使用讽刺。 - user4581301
@acheigrec 有些问题在文档中已经很好地解答了,不值得花时间写正式的回答。vsoftco 已经提到了文档这一点,其他评论者提出了重要的注意事项,但并没有详细解释:为什么应该阅读超过100个字符。 - user4581301

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接