cin.ignore() 究竟做了什么?

What cin.ignore() does exactly?

我的教授告诉我,每次我使用 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?!!

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

它忽略前100个字符,但如果函数在忽略100个字符之前遇到'\n',函数将停止丢弃字符。所以我假设你的教授希望你忽略行中的其余数据,除非它超过 100 个字符。

您不需要每次都使用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());