我有这个简单的程序,我已经用*隐藏了密码。
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。
@ anonmess的评论很接近:在初始化curses(在initscr
中)时,终端说明的smcup
和rmcup
功能可能会导致终端在curses模式下切换到备用屏幕,并且然后退出,在普通画面上显示Password:
。备用屏幕是xterm功能,已复制到许多终端仿真器中,但是confuses some people。
在诅咒模式下有可能(但不是个好主意)printf
:
printf
可能已经移动了光标,它将把文本放置在错误的位置,并且printf
被缓冲,因此您必须执行fflush(stdout)
才能看到printf
输出。ncurses在切换到curses模式之前会执行fflush(stdout)
,因此您的Password:
确实会刷新到正常屏幕。在ncurses 6.0之前,它没有这样做(curses输出使用与printf
相同的输出缓冲区),但是事实证明这是一个坏主意(请阅读release notes for 6.0)。