【问题标题】:How does a string gets displayed 'after' pressing ENTER even though std::cout was used for/after each character in the given code?即使 std::cout 用于给定代码中的每个字符/在给定代码中的每个字符之后,如何在按 ENTER 之后显示字符串?
【发布时间】:2023-03-17 19:37:01
【问题描述】:

这是一个逐字符读取输入的程序,并以同样的方式打印出来。我在这里遇到的概念疑问是,即使在每次输入每个字符的迭代中都使用了 std::cout ,如何仅在按下 ENTER 键时才显示完整的字符串?

int main()
{
 char c;
 while(1)
 {
     c = cin.get();
     if(cin.eof())
         break;
     else cout << c;
 }
 return 0;
}

【问题讨论】:

  • 不要用 C 标签标记 C++ 问题;这两种语言完全不同。
  • 您可能使用的是行缓冲终端,在您按下回车之前不会将输入数据发送到您的应用程序
  • std::cout 是一个流,在读取换行符之前它可能不会刷新。您可以使用 std::flush 强制刷新
  • 终端驱动程序不会让任何字符进入程序,直到您按回车键。阅读Canonical vs non-canonical terminal input

标签: c++


【解决方案1】:

让我们检查您的代码:

#include <iostream>
using namespace std;

int main()
{
    char c;
    while (1)
    {
        c = cin.get();
        if (cin.eof())
            break;
        else cout << c;
    }
    return 0;
}

在我们的第一行中,我们创建了一个char。然后我们进入一个while 循环。 cin.get() 等到用户按下回车键,然后刷新并将输入放入缓冲区。 cin.get() 然后返回缓冲区中的第一个 char,并删除它返回的 charif (cin.eof()) 不执行,因为我们还没有放置 EOF。在接下来的循环中,cin.get() 抓取缓冲区中剩余的 chars,当缓冲区为空时,等待用户输入更多输入并按 Enter。

std::cin 被缓冲,因此您不会立即获得输入。

另外,请继续阅读Why is iostream::eof inside a loop condition (i.e. `while (!stream.eof())`) considered wrong?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 2021-12-13
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多