忽略输入字符

Ignoring the input character

本文关键字:字符 输入      更新时间:2023-10-16

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

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

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

我已经读过一些关于cin.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。行尾的换行符不会追加到字符串中,但会从输入流中删除。

std::getline的文档在"注释"部分中对此进行了解释。


对于更强大的行输入函数,您无法确定之前的输入操作是否在流中留下了换行符(或您使用的任何分隔符),您可以执行以下操作:

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 成员函数将返回要读取的下一个字符,而不会将其从流中删除。如果是换行符,您可以继续忽略它。否则,getline调用将读取整行,包括您刚刚偷看的字符。

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

在这种情况下,

您不需要使用 ignore()getline()不会将换行符放入字符串中。

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

std::getline()不会将分隔符添加到读取的字符串中,默认情况下是换行符