C++ 如何清除cin读取的内容

C++ 如何清除cin读取的内容,c++,io,iostream,cin,flush,C++,Io,Iostream,Cin,Flush,键入整数并按ENTER键后,将存储换行符。 因此,当我执行char c=cin.get()时,先前输入的换行符被分配给变量c。因此跳过了以下循环。如何清除cin的内容?或者如何避免阅读新行 节目: char s; int T; cin >> T; // pressing ENTER here. while(T--) { s = cin.get(); // storing the previously pressed ENTER.('\n') while(s != '\n')

键入整数并按ENTER键后,将存储换行符。
因此,当我执行
char c=cin.get()
时,先前输入的换行符被分配给变量
c
。因此跳过了以下循环。
如何清除
cin
的内容?或者如何避免阅读新行

节目:

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(n);
忽略
n
字符

std::cin.ignore(std::numeric_limits<std::streamsize>::max());
std::cin.ignore(std::numeric_limits::max());
忽略所有字符

std::cin.ignore(std::numeric_limits<std::streamsize>::max());
(可选)添加第二个参数以定义定界字符。默认值为EOF

忽略一个字符

std::cin.ignore(n);
忽略
n
字符

std::cin.ignore(std::numeric_limits<std::streamsize>::max());
std::cin.ignore(std::numeric_limits::max());
忽略所有字符

std::cin.ignore(std::numeric_limits<std::streamsize>::max());
(可选)添加第二个参数以定义定界字符。默认值为EOF

忽略一个字符

std::cin.ignore(n);
忽略
n
字符

std::cin.ignore(std::numeric_limits<std::streamsize>::max());
std::cin.ignore(std::numeric_limits::max());
忽略所有字符

std::cin.ignore(std::numeric_limits<std::streamsize>::max());
(可选)添加第二个参数以定义定界字符。默认值为EOF

忽略一个字符

std::cin.ignore(n);
忽略
n
字符

std::cin.ignore(std::numeric_limits<std::streamsize>::max());
std::cin.ignore(std::numeric_limits::max());
忽略所有字符

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

@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

@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

@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

另一个选项是用于提前检查下一个字符。这样,您就可以使用跳过换行符而不使用非换行符。例如:

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.
}
int getWithoutNewline (istream &in) {
    int ch;
    do {
        ch = in.get();
    } while (ch == '\n' || ch == '\r');
    return ch;
}
您可以修改它以跳过所有空白。使用
cin>>T
时,该选项可能最顺畅

<>你也可以考虑编写自己的字符输入函数,读取下一个字符,但忽略断线(或其他)。例如:

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.
}
int getWithoutNewline (istream &in) {
    int ch;
    do {
        ch = in.get();
    } while (ch == '\n' || ch == '\r');
    return ch;
}
然后使用
getWithoutNewline(cin)
而不是
cin.get()
在解析整数时读取字符。你有灵活性;例如,您可以将换行符转换为空格。这样做的好处是,无需知道任何断线的位置或形式,即可进行操作。但是,它可能不适用于所有情况

就我个人而言,我不会采取盲目丢弃所有内容的做法。我甚至不确定这是否可靠,因为每行之后都没有文件结尾。就这一点而言,与您所要求的最接近的方法是调用
getline()
读取并使用该行的其余部分(包括换行符)


选择其中最适合您的应用程序和用法的一个或其中的某个变体。

您有一些选择

您只需调用
cin.getline()
,它将检索包括换行符在内的行的其余部分,并将指针保留在下一行的开头。只要知道输入行的其余部分是可忽略的,就可以工作

如果知道下一行是换行符,也可以使用
cin.ignore(1)
cin.ignore(2)
。对于产生CR+LF而不是一个的输入流,您必须忽略两个字符,这取决于您是否得到CR或CR+LF

另一个选项是用于提前检查下一个字符。这样,您就可以使用跳过换行符而不使用非换行符。例如:

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.
}
int getWithoutNewline (istream &in) {
    int ch;
    do {
        ch = in.get();
    } while (ch == '\n' || ch == '\r');
    return ch;
}
您可以修改它以跳过所有空白。使用
cin>>T
时,该选项可能最顺畅

<>你也可以考虑编写自己的字符输入函数,读取下一个字符,但忽略断线(或其他)。例如:

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.
}
int getWithoutNewline (istream &in) {
    int ch;
    do {
        ch = in.get();
    } while (ch == '\n' || ch == '\r');
    return ch;
}
然后使用
getWithoutNewline(cin)
而不是
cin.get()
在解析整数时读取字符。你有灵活性;例如,您可以将换行符转换为空格。这样做的好处是,无需知道任何断线的位置或形式,即可进行操作。但是,它可能不适用于所有情况

就我个人而言,我不会采取盲目丢弃所有内容的做法。我甚至不确定这是否可靠,因为每行之后都没有文件结尾。就这一点而言,与您所要求的最接近的方法是调用
getline()
读取并使用该行的其余部分(包括换行符)


选择其中最适合您的应用程序和用法的一个或其中的某个变体。

您有一些选择

您只需调用
cin.getline()
,它将检索包括换行符在内的行的其余部分,并将指针保留在下一行的开头。只要知道inpu的其余部分,就可以工作