Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在linux终端中更改回显字符_C_Linux_Driver_Termios - Fatal编程技术网

C 如何在linux终端中更改回显字符

C 如何在linux终端中更改回显字符,c,linux,driver,termios,C,Linux,Driver,Termios,我对从用户那里收集密码感兴趣 当提示用户输入密码时,我想回显他们输入的每个字符*(星号) void changecho(){ 术语; tcgetattr(标准文件号和期限); term.c_lflag&=~ECHO; tcsetattr(标准文件号、TCSANOW和术语); } 我知道这会关闭echo,但我对回显我选择的内容感兴趣,比如“*”。您描述的功能与echo无关。相反,您只需读取一个字符并在循环中写入一个*,就可以自己实现它: #include <termios.h> #i

我对从用户那里收集密码感兴趣

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

void changecho(){
术语;
tcgetattr(标准文件号和期限);
term.c_lflag&=~ECHO;
tcsetattr(标准文件号、TCSANOW和术语);
}

我知道这会关闭echo,但我对回显我选择的内容感兴趣,比如“*”。

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

#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;
}

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

这不是回音的形式。程序通过简单地编写
*
来响应他们在没有回声的情况下读取的每个字符来实现这一点。我不确定我是否理解你的意思。当我有闪烁的光标,并键入“密码”时,我想在终端中看到“*******”。每次我按一个键,这正是我想要的。非常感谢。我只认为这与ECHO有关,因为这就是处理屏幕输出的方法。
$ gcc foo.c && ./foo
***********