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

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

  用法为:1、添加头文件   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全部巩固了一遍。



你可能感兴趣的:(linuxC语言学习)