Linux C : 登錄密碼星號 * 顯示,包含能回退 backspace

在linux 下需要登錄的一個小程序,不明文顯示密碼,而用星號*代替,並能讓用戶能回退。。。

網上差了些相關資料,特此總結下。。。。。。。

////////////////////          lee.h        //////////////////////////// 需要包含的頭文件 lee.h

#ifndef _LEE_H_         //Linux platform
#define _LEE_H_
#include <termio.h>
#ifndef STDIN_FILENO
#define STDIN_FILENO 0
#endif
int getch(void)
{
        struct termios tm, tm_old;
        int fd = STDIN_FILENO, c;
        if(tcgetattr(fd, &tm) < 0)
                return -1;
        tm_old = tm;
        cfmakeraw(&tm);
        if(tcsetattr(fd, TCSANOW, &tm) < 0)
                return -1;
        c = fgetc(stdin);
        if(tcsetattr(fd, TCSANOW, &tm_old) < 0)
                return -1;
        return c;
}
#else                            //WIN32 platform
#include <conio.h>
#endif

//------------------------------------------分割符-------------------------------------------------------------------------------------

//test.c

#include "lee.h"

#include ……//你自己的頭文件

#define BACESPACE 127

#define ALARM 7

#define maxline 200

void get__pwd(char *buffer)    //get  pass word,putchar '*',replace of every char user input

{
    int i=0;
    char letter;
    char ch=getchar();
    while(( i < maxline ) && (letter != '\r' ))
    {
        letter = getch();
        if(letter==BACKSPACE)    //when backspace
        {    
            if(i>0)
            {
                buffer[i--]='\0';
              //      putchar(BACKSPACE);
                putchar('\b');
                putchar(' ');
               //     putchar(BACKSPACE);
                putchar('\b');

                continue;
            }
            else putchar(7);    //alarm
        }
        else if( letter != '\r')
        {
            buffer[i++]=letter;
               putchar('*');
        }
    }

    buffer[i]='\0';

}

標紅,注意的點:

1. BACKSPCE的ascii 碼是跟終端屬性有關的,對於ubuntu而言 ,打開終端的配置屬性,找到兼容性選項,對於BACKSPACE,設爲Ascii DEL ,則此時爲127

2. 之前putchar(BACKSPACE)總是把0x7f給輸出來了,達不到預期效果,改爲putchar('\b') 就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章