在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') 就可以了