如何清除cin读取的内容

时间:2015-03-03 15:22:19

标签: c++ io iostream cin flush

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

程序:

cin

3 个答案:

答案 0 :(得分:2)

std::cin.ignore();

忽略一个字符。

std::cin.ignore(n);

忽略n个字符。

std::cin.ignore(std::numeric_limits<std::streamsize>::max());

忽略所有字符。

(可选)添加第二个参数以定义分隔符。默认值为EOF。

答案 1 :(得分:1)

您有几个选择。

您可以调用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()来读取和消耗该行的其余部分(包括换行符)。

选择其中任何一种,或其中一种变体,最适合您的应用和用法。

答案 2 :(得分:0)

@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