红联Linux门户
Linux帮助

关于Linux下的密码输入*的问题

发布时间:2017-01-12 10:38:42来源:linux网站作者:hjf161105
这几天一直在做一个聊天室的项目,昨天构思了一下协议和大概步骤,今天就开始正式写了。我先写了一个注册账号和一个登陆的功能,然后运行了一下,发现还行,没啥大问题。不过在客户端输入密码的时候,总感觉怪怪的,因为在输入密码的时候还是可以看到具体内容,感觉在隐私保护方面还是不太够。于是,我想能不能再输入密码的时候不显示具体内容,而是以******代替。接着,我上网查了好久资料,找到了一个叫做getch()的函数。
 
用法为:
1、添加头文件<curses.h>
2、在使用之前要调用initscr(),结束时要调用endwin()。否则会出现不输入字符这个函数也会返回的情况。
3.在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n)
 
但是做完后发现这不是我要的效果,于是我又找了好久,终于找到了一个大神写的函数mygetch()。具体如下:
 
//用于将密码数字转换为*  
int mygetch( )  
{  
struct termios oldt,  
newt;  
int ch;  
tcgetattr( STDIN_FILENO, &oldt );  
newt = oldt;  
newt.c_lflag &= ~( ICANON | ECHO );  
tcsetattr( STDIN_FILENO, TCSANOW, &newt );  
ch = getchar();  
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );  
return ch;  
}
 
之后,我发现这个函数有了我想要的功能,但是我在输入密码之前还有一个输入账号,输入账号的时候最后一位的回车也被mygetch输入了。于是我又想了好久,最终找到了一个方法。具体如下:
 
int show_reg(struct send * userInfo)  
{  
char pass1[20];  
char pass2[20];  
char temp;  
int i = 0;  
int j = 0;  
system("clear");  
printf("\n\n\n\n\n\n\n");  
printf("\t\t\t\t请输入账号:");  
scanf("%s",userInfo->account);
printf("\n\t\t\t\t请输入密码:");
while(i < 20)  
{  
pass1[i] = mygetch();  
if(pass1[i] == 10)  
{  
if(j == 0) //防止输入账号的最后一个回车影响  
j++;  
continue;  
}  
break;  
}  
printf("*");  
i++;  
}  
pass1[i] = '\0';
i = 0;  
printf("\n\n\t\t\t\t请确认您的密码:");  
while(i < 20)  
{  
pass2[i] = mygetch();  
if(pass2[i] == 10)  
{  
break;  
}  
printf("*");  
i++;  
}  
pass2[i] = '\0';
printf("\n\n\t\t\t\t请设计您的昵称:");  
scanf("%s",userInfo->name);
strcpy(userInfo->moto, "我想回家(T_T)");
system("clear");  
printf("\n\n\n\n\n\n\n\t\t\t正在注册......\n");  
sleep(2);
if(strcmp(pass1, pass2) != 0)  
{  
printf("\n\n\t\t\t\t密码输入有误!请重新注册!\n");  
sleep(2);  
return -9;  
}  
else  
{  
strcpy(userInfo->passward, pass1);  
}  
}
 
聊天室我才做了两个功能,注册和登录,感觉挺麻烦的,尤其是后面的保存消息记录以及禁言踢人等,感觉自己还有很多地方没有考虑到,我先把主要的注册、登录和聊天做好再说吧,后面的功能等完成主要功能后再加进去吧,这次的聊天室算是把我之前学的c全部巩固了一遍。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/27740.html