//linux与windows下都行,支持用户输入BACKSPACE时可以删除之前输入的,输入ENTER时,打印出密码
#include <stdio.h>
#include <string.h>
#include <assert.h>
#if _WIN32 //编译开关
#include <conio.h>
#define BACKSPACE 8
#define ENTER 13
#endif
#if unix //编译开关
#include <termios.h>
#include <unistd.h>
#define BACKSPACE 127
#define ENTER 10
#endif
#define MAX_SIZE 20
#if unix
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); //ECHO 显示输入字符 ICANON 使用标准输入模式
assert(0==tcsetattr(STDIN_FILENO, TCSANOW, &new_termios)); //设置终端参数
ch=getchar();
return ch;
}
#endif
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';
}
int main(int argc, char* argv[])
{
char password[MAX_SIZE];
inputdata(password);
putchar('\n');
puts(password);
return 0;
}