window情况下可以使用getch()函数(不回显),然后再用printf或是putchar函数输出*用以模仿输入*
但由于该函数包含在 <conio.h>头文件下,而在linux、Unix环境下往往不包含此头文件
这里可以考虑使用函数
getpass("")
来实现无回显输入
举例
while(ch_password= '\n') //无回显,然后将getpass返回的数组函数复制到自己的密码数组中
{
ch_password=getpass("Input a password");
strcpy(msg.password,ch_password);
}
但不会输出*,也无法删除
如果想以***代替密码,并且具有删除功能怎么办呢
这里再介绍两个linux 系统函数
system("stty -icanon"); //设置一次性读完操作,即getchar()不用回车也能获取字符
system("stty -echo"); //关闭回显,即输入任何字符都不显示
那么上述功能便容易实现了
void handle_password(char *password) //一维数组指针
{
int i=0;
system("stty -icanon"); //设置一次性读完操作,即getchar()不用回车也能获取字符
system("stty -echo"); //关闭回显,即输入任何字符都不显示
while(i < 20) //20假设密码长度不超过20
{
password[i]=getchar(); //获取键盘的值到数组中
if(i == 0 && password[i] == BACKSPACE)
{
i=0; //空密码情况
pass[i]='\0';
continue;
}
else if(password[i] == BACKSPACE)
{
printf("\b \b"); //删除情况,光标前移
password[i]='\0';
i=i-1; //返回到前一个值继续输入
continue; //结束当前循环
}
else if(password[i] == '\n') //回车键结束
{
password[i]='\0';
break;
}
else
{
printf("*");
}
i++;
}
system("stty echo"); //开启回显
system("stty icanon"); //关闭一次性读完操作
}