[使用ncurses库使用getch()屏蔽密码

问题描述 投票:0回答:1

我有这个简单的程序,我已经用*隐藏了密码。

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。

c ncurses getch
1个回答
0
投票

@ anonmess的评论很接近:在初始化curses(在initscr中)时,终端说明的smcuprmcup功能可能会导致终端在curses模式下切换到备用屏幕,并且然后退出,在普通画面上显示Password:。备用屏幕是xterm功能,已复制到许多终端仿真器中,但是confuses some people

在诅咒模式下有可能(但不是个好主意)printf

  • printf输出使ncurses混乱(它不知道printf可能已经移动了光标,它将把文本放置在错误的位置,并且
  • printf被缓冲,因此您必须执行fflush(stdout)才能看到printf输出。

ncurses在切换到curses模式之前会执行fflush(stdout),因此您的Password:确实会刷新到正常屏幕。在ncurses 6.0之前,它没有这样做(curses输出使用与printf相同的输出缓冲区),但是事实证明这是一个坏主意(请阅读release notes for 6.0)。

© www.soinside.com 2019 - 2024. All rights reserved.