我有兴趣从用户那里收集密码。
当提示用户输入密码时,我想为他们输入的每个字符回显给他们*(星号)。
void changeEcho() {
termios term;
tcgetattr(STDIN_FILENO, &term);
term.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &term);
}
我知道这将关闭回显,但是我有兴趣回显我选择的内容,在我的情况下为'*'。
答案 0 :(得分:3)
您描述的功能与回显无关。相反,您可以通过简单地读取一个字符并在循环中编写一个*
来自己实现它:
#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
***********
由程序来存储字符串,处理退格键,并且每多字节字符仅显示一个*
。