【问题标题】:How to clear the contents read by cin如何清除cin读取的内容
【发布时间】:2015-05-04 07:41:19
【问题描述】:

输入整数并按 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.
  {
   .
   .
   .
   .
   .
   .
  }
}

【问题讨论】:

  • 您没有使用格式化输入是否有原因?
  • @utnapistim 我需要一次读取一个字符并对读取的字符执行一些任务。

标签: c++ io iostream cin flush


【解决方案1】:
std::cin.ignore();

忽略一个字符。

std::cin.ignore(n);

忽略n 个字符。

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

忽略所有字符。

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

【讨论】:

  • ... 最多一个分隔符,默认为 EOF。您可能想提及这一点,或者更好的是,建议使用'\n' 作为分隔符。
  • @Angew 添加。谢谢。
  • @Angew EOF 是一个字符还是std::istream 的状态实际上(或两者)?
  • @πάνταῥεῖ 实际上是it's not a character。我一生都在想有一个EOF角色......
  • @πάνταῥεῖ 准确地说,默认分隔符是Traits::eof(),对于std::char_traits&lt;T&gt;,它是“一个不等于T的任何值的整数值”。所以它不是一个字符,而是一个实现定义的值。
【解决方案2】:

你有几个选择。

您可以只调用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 &gt;&gt; T 时,该选项可能最顺畅。

您还可以考虑编写自己的字符输入函数,该函数读取下一个字符但忽略换行符(或其他)。例如:

int getWithoutNewline (istream &in) {
    int ch;
    do {
        ch = in.get();
    } while (ch == '\n' || ch == '\r');
    return ch;
}

然后在解析整数时使用getWithoutNewline(cin) 而不是cin.get() 来读取字符。你在那里有灵活性;你可以例如将换行符转换为空格。这样做的好处是能够在您无需了解换行符的位置或形式的情况下进行操作。但是,它可能不适用于所有情况。

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

选择最适合您的应用和使用的其中一种或其中一种变体。

【讨论】:

    【解决方案3】:

    @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
    

    【讨论】:

    • 你也可以getline() 代替(它一般不等效,但它等效于 OP 读取整数并忽略行的其余部分的情况)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2010-12-19
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    相关资源
    最近更新 更多