【问题标题】:How to change the echo character in a linux terminal如何在 Linux 终端中更改回显字符
【发布时间】:2019-05-01 01:43:17
【问题描述】:

我有兴趣从用户那里收集密码。

当提示用户输入密码时,我想为他们输入的每个字符回显 *(星号)。

void changeEcho() {
    termios term;
    tcgetattr(STDIN_FILENO, &term);
    term.c_lflag &= ~ECHO;
    tcsetattr(STDIN_FILENO, TCSANOW, &term);
}

我知道这会关闭回显,但我有兴趣回显我选择的内容,在我的例子中是“*”。

【问题讨论】:

  • 这不是一种回声。程序通过简单地编写* 来响应它们读取的每个字符而不回显来做到这一点。
  • 我不确定我理解你的意思。当我有闪烁的光标并输入“密码”时,我想在终端中看到“********”。每次按一个键一个 *。

标签: c linux driver termios


【解决方案1】:

您描述的功能与回声无关。相反,您只需读取一个字符并在循环中写入一个 * 即可自己实现它:

#include <termios.h>
#include <unistd.h>
#include <stdio.h>


int main() {
    char c;
    char p = '*';
    struct termios term, original;
    tcgetattr(STDIN_FILENO, &term);
    original = term;
    term.c_lflag &= ~ECHO & ~ICANON;
    tcsetattr(STDIN_FILENO, TCSANOW, &term);

    while (read(STDIN_FILENO, &c, 1) == 1 && c != '\n')
        write(STDOUT_FILENO, &p, 1);
    printf("\n");

    tcsetattr(STDIN_FILENO, TCSANOW, &original);
    return 0;
}

当你运行它并输入内容时,你看到的只是*s:

$ gcc foo.c && ./foo
***********

由程序来存储字符串,处理退格,每个多字节字符只显示一个*

【讨论】:

  • 正是我想要的。谢谢你。我只认为它与 ECHO 有关,因为这是处理屏幕输出的原因。
猜你喜欢
  • 2012-12-28
  • 2010-12-20
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2018-10-29
  • 1970-01-01
相关资源
最近更新 更多