在軟體開發中,往往會遇到要求使用者輸入密碼的情況。出于對密碼的保密,輸入的字元是不會顯示到螢幕上的。例如,在登入Linux系統時,輸入使用者名後,輸入的密碼是不顯示的。可用getch()這個函數,但是在linux檔案下,此函數所在的頭檔案為curses.h。
curses庫是由柏克萊大學的Bill Joy及Ken Arnold所開發的。當時開發curses庫的目的是為了解決程式對于不同終端的相容性。curses庫用于處理Linux/UNIX上的光标移動及螢幕顯示問題。考慮到curses庫的複雜性,這裡隻是簡單地介紹一下curses庫的使用。
使用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();
}
#include<stdio.h>
#include<curses.h>
#include<unistd.h>
#include<stdlib.h>
void init()
{
initscr();
cbreak(); //調用cbreak之後,除了“Del”和“Ctrl”鍵之外,接受其他字元的輸入
nl();//輸出時,換行是否作為回車字元
noecho();//是否立即顯示
intrflush(stdscr,FALSE);//若為TRUE,可以加快中斷
keypad(stdscr,TRUE);//允許使用鍵盤上的特殊字元
refresh();//重新繪制螢幕内容,在調用initsr函數後,第一次調用refresh函數會清除題目顯示
}
int getpasswd(char *passwd,int size)
{
int c;
int n = 0;
printw("please input password:");
while((c != '\n')&& (n < (size-1)))
{
c = getch();
if(c != '\b')
{
printw("*");
}
/*if( c == '\b')
{
printw("a\n");
passwd[n--] = '\0';
}
*/
}
passwd[n] = '\0';
return n;
}
int main()
{
char passwd[20];
int n;
init();
n = getpasswd(passwd,sizeof(passwd));
printw("\nyour password is %s\n",passwd);
refresh();
endwin();
return 0;
}
但是這段程式是有問題的,隻能輸入然後看到的是星号,但是按了後退鍵并沒有什麼反應,還有不能把輸入的函數的原型輸出來。。