这几天一直在做一个聊天室的项目,昨天构思了一下协议和大概步骤,今天就开始正式写了。我先写了一个注册账号和一个登陆的功能,然后运行了一下,发现还行,没啥大问题。不过在客户端输入密码的时候,总感觉怪怪的,因为在输入密码的时候还是可以看到具体内容,感觉在隐私保护方面还是不太够。于是,我想能不能再输入密码的时候不显示具体内容,而是以******代替。接着,我上网查了好久资料,找到了一个叫做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全部巩固了一遍。