【问题标题】:trying to understand std::cin.get()试图理解 std::cin.get()
【发布时间】:2014-11-22 18:55:50
【问题描述】:

大家好,我正在阅读有关 std::cin.get() 函数的信息,并读到我们使用它来捕获在向控制台输入任何输入后输入的换行符。但是我在编写一个非常基本的小程序时有点困惑,无法理解它的行为。

所以我的程序是用于 c++ 入门加的练习。无论如何,代码如下:

#include <iostream>
#include <cstring>

void countWords () {
  char word [100];
  char wordDone [] = "done";
  int count = 0;

  std::cout << "Enter words (to stop, type the word done): \n";
  std::cin >> word;

  while (strcmp(word, wordDone) != 0) {
    std::cin >> word;
    count += 1;
  }

  std::cout << "You entered a total of " << count << " words.";

  std::cin.get();
  std::cin.get();  
}

int main () {
  countWords ();

  std::cin.get();
  return 0;
}

现在的问题是,当我运行上面的代码时,屏幕给了我正确的输出,但它在没有等待我输入返回的情况下消失了。

但是当我没有创建上面的 countWords() 函数时,如果我在 main() 函数中编写整个代码,它可以完美地工作,这让我很困惑。

据我了解,当我在控制台中输入char数组并按回车时,缓冲区将控制台数据和换行符保留在队列中,并且在处理完while循环并显示cout后,返回被吸收第一个 std::cin.get()。那么程序应该等待我输入另一个返回,然后它会被第二个 cin.get() 吸收,并且它应该问我另一个返回,因为 main 函数中也有一个 cin.get() 。但是由于某种我无法弄清楚的原因,输出屏幕就消失了。

请问有什么cmets或解释吗??

【问题讨论】:

  • 根据您的描述,您应该只需要按两次回车键。

标签: c++ get std cin


【解决方案1】:

您似乎有什么东西卡在缓冲区中,导致您的所有gets 都被填满。

我建议如下:

cin.ignore(-1, '\n');

【讨论】:

  • sync() 的效果是实现定义的。尝试改用std::cin.ignore(-1, '\n'),这是一种更符合标准的丢弃字符的方式。
【解决方案2】:
如果流中没有可用字符,

cin.get() 将返回 EOF 并设置流的失败位。我怀疑这就是正在发生的事情,所以你的程序只会遍历你所有的 cin.gets 而不是等待另一个返回字符。

关于 istream::get 工作原理的说明: istream::get

【讨论】:

  • +-1: cin.get() 将在流到达文件结尾时返回 EOF,除非您键入 Ctrl+D(或您的终端等效项),否则标准输入不会发生这种情况。这与流缓冲区中有多少可用字符(缓冲区,而不是“在流中”:流不是容器而是数据流)几乎没有关系。
猜你喜欢
  • 1970-01-01
  • 2018-07-05
  • 2022-08-12
  • 2018-03-02
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多