搜到的大多是不显示*的,有些是显示*但是无法使用退格键,或者中断。故自己参考修改实现:
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
int getch(void)
{
struct termios tm, tm_old;
int fd = STDIN_FILENO, c;
if(tcgetattr(fd, &tm) < 0)
return -1;
tm_old = tm;
#if 0
cfmakeraw(&tm);
#else
// tm.c_lflag &= ~ECHO;
//tm.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN);
tm.c_lflag &= ~(ECHO | ECHONL | ICANON );
// tm.c_lflag &= ~ECHOE;
// tm.c_cc[] =
// tm.c_iflag &= ~(IXON);
// tm.c_oflag &= ~OPOST;
// tm.c_oflag |= (BSDLY);
#endif
if(tcsetattr(fd, TCSANOW, &tm) < 0)
return -1;
c = fgetc(stdin);
if(tcsetattr(fd, TCSANOW, &tm_old) < 0)
return -1;
return c;
}
void GetString(char *buf) {
int i;
char ch;
i = 0;
while(1) {
ch = getch();
// printf("%d%d",ch,ch);
if (ch == '\n') {
//printf("end\n");
break;
} else if (ch == 127) {
if (i > 0) {
printf("\b \b");
buf[--i] = '\0';
}
i--;
} else {
buf[i] = ch;
//printf("%d", i);
printf("*");
}
i++;
}
buf[++i] = '\0';
printf("\n");
}
int main(void) {
char password1[256] = {0};
char password2[256] = {0};
printf("Password:");
GetString(password1);
printf("Verify:");
GetString(password2);
if (strncmp(password1, password2, 256) == 0) {
printf("Set Password Ok!\nPassword:%s\n", password1);
} else {
printf("Verify Error!\n%s is not equal %s\n", password1, password2);
}
return 0;
}
以上代码实现linux密码输入显示*。
本文永久更新地址://m.ajphoenix.com/linux/21806.html