即使 std::cout 用于给定代码中的每个字符/在给定代码中的每个字符之后,如何在按 ENTER 之后显示字符串?

Posted

技术标签:

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

这是一个逐字符读取输入的程序,并以同样的方式打印出来。我在这里遇到的概念疑问是,即使在每次输入每个字符的迭代中都使用了 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。 相关:***.com/questions/22026751/… 【参考方案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?。

【讨论】:

以上是关于即使 std::cout 用于给定代码中的每个字符/在给定代码中的每个字符之后,如何在按 ENTER 之后显示字符串?的主要内容,如果未能解决你的问题,请参考以下文章

Cout 无符号字符

C ++中的非空终止字符数组

为什么我擦除其他字符时最后一个字符加倍,并且如何防止呢?

字符作为数字打印到 std::cout

在向量中添加每个int 到一个字符串

当我用单引号将字符串括起来时,C++ std::cout 打印奇怪的字符[重复]