一个小问题,在linux编一个接收用户输入密码小程序,不显示密码。google和baidu了一下,竟然没有找到现成的,好吧,自己编一个。哪里想到,竟然一波三折。哈哈,最终还是搞定了!
1)很容易根据termios的结构屏蔽终端属性的输出。
但是,这样一来,用户的输入不显示在屏幕上。用户不知道自己输入的个数。对输入的内容心里也没有底。非常不方便。
2)于是改为一个一个字符的处理格式。编程实现了用''*''代替用户的输入。但是这样linux处于非授权模式,一个限制是‘退格’键不能用。用户必须保证一次输入正确,万一错了的话,只能眼睁睁的重新运行程序,重来一次。
3)我最终在2)的基础上,实现了用''*''代替用户的输入,并且backspacekey可用。
附代码:
#include
#include
#definepassLength100
intmain(intargc,char**argv)
{
structtermiotio,tin;
char*password=(char*)malloc(passLength);
char*b=password;
ioctl(0,TCGETA,&tio);
tin=tio;
tin.c_lflag&=~ECHO;/*turnoffECHO*/
tin.c_lflag&=~ICANON;/*turnoffICANON*/
tin.c_lflag&=~ISIG;
tin.c_cc[VINTR]=1;
tin.c_cc[VMIN]=1;
tin.c_cc[VTIME]=0;
/*
*Setthenewmodes.Againweignorereturn
*values.
*/
ioctl(0,TCSETA,&tin);
charselected;
intorder=0;
printf("Enterpassword:");
do{
selected=fgetc(stdin);
if((selected==''\b'')&&(order>0))
{
fputc(''\b'',stdout);
fputc('''',stdout);
fputc(''\b'',stdout);
order--;
password--;
*password=''\0'';
}elseif((selected!=''\n'')&&(selected!=''\r'')&&(selected!=''\b''){
*password =selected;
order ;
fputc(''*'',stdout);
fflush(stdout);
}
}while((selected!=''\n'')&&(selected!=''\r'')&&(order>=0)&&(order
/*
*Resettheoldttymodes.
*/
ioctl(0,TCSETA,&tio);
fprintf(stdout,"\nYouentered:%s\n",b);
free(b);
exit(0);
}
linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码
阅读(393) | 评论(0) | 转发(0) |