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