输入不回显

有些时候,我们希望在终端输入的内容不要(明文)显示,比如键入的密码口令,下面针对不同的要求整理了几种方法。

Shell服本

shell中的read命令提供了-s选项,简单方便。

Windows下C语言

可借助conio.h文件提供的接口实现。

#include <conio.h>
int sread(char *prompt, char *buf) {
    int i = 0;
    char ch;
    printf("%s", prompt);
    while ((ch = getch()) != '\r') {
        if (ch == '\b') {
            printf("\b \b");
            if (i) i -= 1;
        } else {
            buf[i++] = ch;
            putchar('*');
        }
    }
    buf[i] = 0;
    return i;
}

Linux下C语言

Linux下有现成的函数getpass实现此功能,但manual上说该函数已废弃,可以通过termios.h提供的接口来实现。

#include <termios.h>
void toggle_echo() {
    struct termios tc;
    tcgetattr(STDIN_FILENO, &tc);
    tc.c_lflag ^= ECHO;
    tcsetattr(STDIN_FILENO, TCSAFLUSH, &tc);
}
int sread(char *prompt, char *buf) {
    int i = 0;
    char ch;
    printf("%s", prompt);
    toggle_echo();
    while ((ch = getchar()) != '\n') {
        if ('\b' == ch) {
            if (i) i -= 1;
        } else buf[i++] = ch;
    }
    toggle_echo();
    buf[i] = 0;
    return i;
}
Table of Contents