使用curses库中的函数前,需要进行必要的初始化工作。程序需要使用initscr函数来开启curses模式,在结束前调用endwin函数来关闭curses模式。代码如下:
#include <curses.h>
int main(int argc,char* argv[]){
initscr();
…
endwin();
}
在实际使用中,出于方便的目的,往往把一些初始化的动作放置在初始化函数中,以方便调用。具体代码如下:
void initial()
{
initscr();
cbreak();
nl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
}
代码中使用到了一些curses库的函数,含义如下。
l cbreak():调用cbreak函数后,除了“Del”和“Ctrl”键外,接受其他所有字符输入。
l nl()/nonl():输出时,换行是否作为回车字符。nl函数将换行作为回车符,而nonl函数相反。
l noecho()/echo():关闭/打开输入回显功能。
l intrflush(WINDOW *win, bool bf):win为标准输出。当bf为true时输入Break,可以加快中断的响应。但是,有可能会造成屏幕输出信息的混乱。
l keypad(WINDOW *win, bool bf):win为标准输出。调用keypad函数后,将可以使用键盘上的一些特殊字符,如方向键,转化成curses.h中的特殊键。
l refresh():重绘屏幕显示内容。在调用initscr函数后,第一次调用refresh函数会清除屏幕显示。
程序p6.3.c给出了使用curses库实现密码输入、屏蔽输出结果的实例。具体代码如下:
//p6.3.c 使用curses实现密码输入
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <unistd.h>
void init()
{
initscr();
cbreak();
nl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
}
int getpasswd(char* passwd, int size)
{
int c;
int n = 0;
printw("Please Input password:");
do{
c = getch();
if (c != '/n'){
echochar('*');//printw("*");
passwd[n++] = c;
}
}while(c != '/n' && n < (size - 1));
passwd[n] = '/0';
return n;
}
int main()
{
char passwd[20];
int n;
init();
n=getpasswd(passwd, sizeof(passwd));
printw("/nYour passwd is:%s/n", passwd);
printw("Press any key continue .../n");
refresh();
getchar();
endwin();
return 0;
}
使用gcc编译该程序,获得名为p6.5的可执行程序。注意程序中使用了curses库,因此编译时要指明该库的名称。具体编译和执行情况如下:
[program@localhost charter6]$ gcc -o p6.3 p6.3.c -lcurses
[program@localhost charter6]$ ./p6.3
Please Input password:*******
Your passwd is:afdafds
Press any key continue ...