天天看點

帶星号的密碼輸入

在軟體開發中,往往會遇到要求使用者輸入密碼的情況。出于對密碼的保密,輸入的字元是不會顯示到螢幕上的。例如,在登入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;
}
           

但是這段程式是有問題的,隻能輸入然後看到的是星号,但是按了後退鍵并沒有什麼反應,還有不能把輸入的函數的原型輸出來。。