【问题标题】:Suppress echo to cout from cin抑制从 cin 到 cout 的回声
【发布时间】:2020-01-23 23:39:35
【问题描述】:

我正在尝试创建一个非常简单的聊天应用程序,用户在其中输入内容(由 cin 接收),然后我手动回显他们的输出,但 cin 在用户按键盘输入后自然会打印到控制台。

有没有办法在用户从 cin 返回后将此回显抑制回 cout,以便我可以用自己的消息覆盖它?

例如:

int main() 
{
    string str;
    while(true) 
    {
         getline(cin, str)
         cout << "Person: " << str << endl;
    }
}

输出如下:

Some text I typed
Person: Some text I typed

当用户发送新行时,第一行会自动回显到终端。这是我想压制的线。

有什么想法吗?如果可能的话,我会尽量避免使用任何第三人称图书馆。

【问题讨论】:

  • 输入文本时第一行不是打印出来的吗? (而不是按回车后)?
  • 您是否尝试过使用\r 覆盖第一行?
  • 该行没有“回显到终端”,也没有“cin 自然打印到控制台”。 cin 不是你的 tty。 cout 不是你的 tty。不要将两者混为一谈。您看到的问题是终端处于熟化模式并显示正在键盘上输入的数据。 (例如,您的程序与这些字符的显示无关)。如果您想更改终端的行为,您需要将 tty 置于原始模式。而且您确实想使用 3rd 方库来做到这一点。
  • 相关:Reading a password from std::cin。我也会研究类似ncurses
  • "cin 在用户点击输入后自然打印到控制台“你为什么这么认为? “自然”对您意味着什么?

标签: c++ input


【解决方案1】:

据我所知,如果不使用任何第三方库,这在标准 C++ 上是不可能的。如果您愿意使用特定于操作系统的库,那么this linkthis one 可能会有所帮助。不幸的是,这在本机 C++ 中不是一个选项,因为它取决于操作系统来决定它如何处理控制台输出(因此,例如,为什么您需要操作系统特定的解决方案来处理颜色等高级控制台内容)。

【讨论】:

  • 就我而言,这是一个 linux 应用程序。两个链接都建议设置 termios newt.c_lflag &= ~ECHO,它会完全隐藏用户输入(就像在密码模式下一样),因此除非按 Enter,否则用户无法看到他正在输入的内容。这不是我的问题的好答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
相关资源
最近更新 更多