c语言输入密码回显程序,支持用户输入BACKSPACE时可以删除之前输入的,输入ENTER时,打印出密码
代码参考了和改进了如下链接的程序:http://www.cnblogs.com/ccmfc/archive/2010/12/27/1918363.html
代码如下:
#include <stdio.h>
#include <assert.h>
#include <termios.h>
#include <unistd.h>
#define BACKSPACE 127
#define ENTER 10
#define MAX_SIZE 20
//对终端进行设置,并进行字符的录入
int getch()
{
int ch=0;
struct termios old_termios, new_termios;
assert(0==tcgetattr(STDIN_FILENO, &old_termios));
memcpy(&new_termios, &old_termios, sizeof(new_termios));
new_termios.c_lflag &= ~(ECHO | ICANON);
assert(0==tcsetattr(STDIN_FILENO, TCSANOW, &new_termios));
ch=getchar();
return ch;
}
//恢复中断的设置
void getch_terminal_bak()
{
struct termios old_termios, new_termios;
assert(0==tcgetattr(STDIN_FILENO, &old_termios));
memcpy(&new_termios, &old_termios, sizeof(new_termios));
new_termios.c_lflag |= (ECHO | ICANON);
assert(0==tcsetattr(STDIN_FILENO, TCSANOW, &new_termios));
return ;
}
void inputdata(char* psrc)
{
int i=0;
while(i<MAX_SIZE && ((psrc[i]=getch())!=ENTER)) {
//支持删除操作
if(psrc[i]==BACKSPACE) {
psrc[i]='\0';
psrc[--i]='\0';
putchar('\b');
putchar(' ');
putchar('\b');
i--;
}
else
putchar('*');
i++;
}
psrc[i]='\0';
getch_terminal_bak();
}
int main()
{
char passwd[20];
char passwd1[20];
printf("Changing password for %s:\n",argv[0]);
inputdata(passwd);
putchar('\n');
printf("put the password again:\n",argv[0]);
inputdata(passwd1);
putchar('\n');
if(strcmp (passwd ,passwd1) != 0){
printf("erro,the twice inputs is not same\n");
return -1;
}
puts(passwd1);
return ;
}