忽略输入字符

Ignoring the input character

所以,我想用cin.ignore(200,'\n')输入一行并保存成一个字符串,而不是将\n保存为字符串。但是当我这样做时:

cin.ignore(200,'\n');
getline(cin,name);

它让我输入两次,但我只想问我一次并将其保存到名称中。

我读过一些关于 cin.clear() 的内容,但我认为这不是我需要的,或者我误解了 clear 的作用。

谢谢!

cin.ignore(n, ch) 从与 std::cin 关联的流中丢弃 个字符,直到跳过 n 个字符,或直到 ch 可见。 cin.ignore(200, '\n'); 丢弃第一个输入,直到换行符。然后你会得到一条线,它将接受你的第二个输入。

如果您想在执行以空格分隔的输入操作后立即读取一行,您可能需要使用cin.ignore(n, ch);结构,例如

int i = 0;
std::cin >> i; // reads an integer, possibly leaving a '\n' in the stream
std::cin.ignore(200, '\n'); // reads and discards until a newline is seen
std::string name;
std::getline(std::cin, name); // reads a full line

在您的情况下,如果您没有进行任何以空格分隔的输入,cin.ignore 将跳过第一次提供行输入的尝试。您应该立即使用 std::getline。行尾的换行符 附加到字符串,但已从输入流中删除。

documentation for std::getline 在 "Notes" 部分对此进行了解释。


为了获得更强大的行输入功能,如果您无法确定之前的输入操作是否在流中留下换行符(或您正在使用的任何分隔符),您可以执行以下操作:

char ch;
std::cin.peek(ch);
if (ch == '\n') {
    std::cin.ignore(1, '\n'); // or std::cin.get(ch);
}
std::string line;
std::getline(std::cin, line);

peek 成员函数将 return 读取下一个字符,而不将其从流中删除。如果它是一个换行符,你可以继续并忽略它。否则,getline 调用将读取整行,包括您刚刚查看的字符。

或者,如果您只想使用空格,则可以使用 std::ws 操纵器。

在这种情况下您不需要使用 ignore()getline() 不会将换行符放入字符串中。

它要求您输入两次的原因是因为 ignore() 函数正在删除,直到您的第一个 200 个输入字符或直到换行符(您的分隔符)所以下一个 getline() 可能没有任何可读的内容因此要求您输入(当然除非您的第一个输入包含超过 200 个字符,在这种情况下它将读取缓冲区中的剩余字符)。

std::getline()不会在读取的字符串中加入分隔符字符,默认为换行符 .