首页 > 解决方案 > 如何更改 Linux 终端中的回显字符

问题描述

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

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

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

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

标签: clinuxdrivertermios

解决方案


您描述的功能与回声无关。相反,您可以通过简单地读取字符并*在循环中写入 a 来实现它:

#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
***********

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


推荐阅读