忽略输入字符
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()
不会在读取的字符串中加入分隔符字符,默认为换行符 .
所以,我想用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()
不会在读取的字符串中加入分隔符字符,默认为换行符 .