C Маскировка пароля с помощью getch () с использованием библиотеки ncurses - PullRequest
1 голос
/ 27 февраля 2020

У меня есть эта простая программа, и я достиг сокрытия пароля с помощью *.

printf("Password: ");

initscr();
noecho();

char passwd[MAX_PASS]
int p=0; 
    do{ 
        passwd[p]=getch(); 
        if(passwd[p]!='\n'){ 
            printw("*"); 
        } 
        p++; 
    }while(passwd[p-1]!='\n'); 
    passwd[p-1]='\0';

endwin();

Я могу замаскировать пароль с помощью *. Проблема в том, что первая печать не будет отображаться в моем терминале, пока endwin (); случается, я думаю, когда я вернусь к тому, что было напечатано в терминале раньше ..... какие-либо подсказки, почему и как я собираюсь это исправить? Я имею в виду, я хочу показать первый printf и printf перед этим.

1 Ответ

1 голос
/ 27 февраля 2020

Комментарий @anonmess близок: при инициализации curses (в initscr) возможности описания терминала smcup и rmcup могут привести к переключению терминала на альтернативный экран во время проклятий режиме, а затем вернитесь назад, показывая Password: на обычном экране . Альтернативный экран - это функция xterm, которая копируется во многие эмуляторы терминала, но она смущает некоторых людей .

Возможно (но не очень хорошая идея) сделать printf в то время как в режим curses:

  • вывод printf сбивает с толку ncurses (он не знает, что printf мог переместить курсор, он поместит текст в неправильное место), и
  • printf буферизуется, поэтому вам нужно будет сделать fflush(stdout), чтобы даже увидеть вывод printf.

ncurses делает fflush(stdout) перед переключением в режим проклятий, поэтому ваш Password: выводится на нормальный экран. До ncurses 6.0 это не делалось (для вывода curses использовались те же выходные буферы, что и для printf), но это оказалось плохой идеей (см. Примечания к выпуску для 6.0 ).

...