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());
我的教授告诉我,每次我使用 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());