如何清除cin读取的内容
How to clear the contents read by cin
输入整数并按 ENTER 后,换行符被存储。
因此,当我执行 char c = cin.get()
时,先前输入的换行符被分配给变量 c
。因此跳过了以下循环。
。如何清除 [=13 的内容=]?或者如何避免读取换行符?
程序:
char s;
int T;
cin >> T; // pressing ENTER here.
while(T--)
{
s = cin.get(); // storing the previously pressed ENTER.('\n')
while(s != '\n') // does not execute.
{
.
.
.
.
.
.
}
}
std::cin.ignore();
忽略一个字符。
std::cin.ignore(n);
忽略 n
个字符。
std::cin.ignore(std::numeric_limits<std::streamsize>::max());
忽略所有字符。
可选地,添加第二个参数来定义定界字符。默认为 EOF。
@zenith 的回答是正确的。除此之外,还要看看 std::cin.peek()
.
这是一些代码:
char s;
int T;
cin >> T; // pressing ENTER here.
while(T--)
{
while(std::isspace(cin.peek())) // peek used here
cin.ignore(); // ignore spaces, tabs and enter
你有几个选择。
您可以只调用 cin.getline()
,它将检索该行的剩余部分,包括换行符并将指针留在下一行的开头。只要您知道输入行的其余部分是可忽略的,就可以工作。
如果您知道下一个换行符,您也可以使用cin.ignore(1)
或cin.ignore(2)
。对于产生 CR+LF 而不是仅产生一个的输入流,您必须忽略两个字符,并且由您决定是得到 CR 还是 CR+LF。
另一种选择是使用cin.peek()
提前检查下一个字符是什么。这样您就可以使用跳过换行符而不使用非换行符。例如:
void skipNewlines (istream &in) {
int ch;
while ((ch = in.peek()) == '\r' || ch == '\n')
in.ignore();
// and now newlines skipped and next in.get() will read the next char.
}
您可以修改它以跳过所有空格。该选项可能在您使用 cin >> T
.
时最流畅
您也可以考虑编写自己的字符输入函数来读取下一个字符但忽略换行符(或其他)。例如:
int getWithoutNewline (istream &in) {
int ch;
do {
ch = in.get();
} while (ch == '\n' || ch == '\r');
return ch;
}
然后在解析整数时使用 getWithoutNewline(cin)
而不是 cin.get()
来读取字符。你在那里有灵活性;你可以例如将换行符转换为空格。这样做的好处是无需了解换行符的位置或形式就可以进行操作。但是,它可能不适用于所有情况。
就我个人而言,我不会采取盲目丢弃所有内容的方法。我什至不确定这是否可靠,因为每行之后都没有文件结尾。就目前而言,最接近您要求的是调用 getline()
来读取和使用该行的其余部分(包括换行符)。
选择最适合您的应用和使用的其中一种,或其中一种的变体。
输入整数并按 ENTER 后,换行符被存储。
因此,当我执行 char c = cin.get()
时,先前输入的换行符被分配给变量 c
。因此跳过了以下循环。
。如何清除 [=13 的内容=]?或者如何避免读取换行符?
程序:
char s;
int T;
cin >> T; // pressing ENTER here.
while(T--)
{
s = cin.get(); // storing the previously pressed ENTER.('\n')
while(s != '\n') // does not execute.
{
.
.
.
.
.
.
}
}
std::cin.ignore();
忽略一个字符。
std::cin.ignore(n);
忽略 n
个字符。
std::cin.ignore(std::numeric_limits<std::streamsize>::max());
忽略所有字符。
可选地,添加第二个参数来定义定界字符。默认为 EOF。
@zenith 的回答是正确的。除此之外,还要看看 std::cin.peek()
.
这是一些代码:
char s;
int T;
cin >> T; // pressing ENTER here.
while(T--)
{
while(std::isspace(cin.peek())) // peek used here
cin.ignore(); // ignore spaces, tabs and enter
你有几个选择。
您可以只调用 cin.getline()
,它将检索该行的剩余部分,包括换行符并将指针留在下一行的开头。只要您知道输入行的其余部分是可忽略的,就可以工作。
如果您知道下一个换行符,您也可以使用cin.ignore(1)
或cin.ignore(2)
。对于产生 CR+LF 而不是仅产生一个的输入流,您必须忽略两个字符,并且由您决定是得到 CR 还是 CR+LF。
另一种选择是使用cin.peek()
提前检查下一个字符是什么。这样您就可以使用跳过换行符而不使用非换行符。例如:
void skipNewlines (istream &in) {
int ch;
while ((ch = in.peek()) == '\r' || ch == '\n')
in.ignore();
// and now newlines skipped and next in.get() will read the next char.
}
您可以修改它以跳过所有空格。该选项可能在您使用 cin >> T
.
您也可以考虑编写自己的字符输入函数来读取下一个字符但忽略换行符(或其他)。例如:
int getWithoutNewline (istream &in) {
int ch;
do {
ch = in.get();
} while (ch == '\n' || ch == '\r');
return ch;
}
然后在解析整数时使用 getWithoutNewline(cin)
而不是 cin.get()
来读取字符。你在那里有灵活性;你可以例如将换行符转换为空格。这样做的好处是无需了解换行符的位置或形式就可以进行操作。但是,它可能不适用于所有情况。
就我个人而言,我不会采取盲目丢弃所有内容的方法。我什至不确定这是否可靠,因为每行之后都没有文件结尾。就目前而言,最接近您要求的是调用 getline()
来读取和使用该行的其余部分(包括换行符)。
选择最适合您的应用和使用的其中一种,或其中一种的变体。