用户信息:
ID、昵称、密码、手机号
登录前的功能:
1、注册用户
要确认密码
2、用户登录
ID、密码(二分查找)
3、重置密码
ID、昵称、手机号全部符合
4、遍历用户
5、退出系统
登录后的功能:
1、查看信息
2、修改信息
修改昵称、修改手机号
3、修改密码
先输入旧密码、再输入新密码、再确认新密码
4、退出登录
#include <stdio.h>
#include <getch.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct User
{
int id;
char name[20];
char passwd[10];
char phone[12];
}User;
User users[100];
size_t cnt = 0;
float msg_show_sec = 0.8;
int login_index;
// 通用的工具函数
void clear_stdin(void)
{
stdin->_IO_read_ptr = stdin->_IO_read_end;
}
char* get_str(char* str,size_t size)
{
clear_stdin();
size_t len = strlen(fgets(str,size,stdin));
if('\n' == str[len-1])
str[len-1] = '\0';
clear_stdin();
}
void put_str(const char* msg,float sec)
{
printf("%s\n",msg);
usleep(1000000*sec);
}
char get_cmd(char start,char end)
{
clear_stdin();
printf("---------------------------\n");
printf("请输入指令[%c,%c]:",start,end);
for(;;)
{
char cmd = getch();
if(start <= cmd && cmd <= end)
{
printf("%c\n",cmd);
return cmd;
}
}
}
bool yes_or_no(const char* msg)
{
clear_stdin();
printf("%s(y/n)?\n",msg);
for(;;)
{
char cmd = getch();
if('y' == cmd || 'Y' == cmd)
return true;
if('n' == cmd || 'N' == cmd)
return false;
}
}
void anykey_continue(void)
{
clear_stdin();
printf("按任意键继续...\n");
getch();
}
char* get_passwd(char* pwd,size_t size,bool is_show)
{
clear_stdin();
size_t index = 0;
while(index < size-1)
{
pwd[index] = getch();
if('\n' == pwd[index])
{
break;
}
if(127 == pwd[index])
{
if(index > 0)
{
index--;
if(is_show)
{
printf("\b \b");
}
}
continue;
}
if(is_show)
{
printf("*");
}
index++;
}
pwd[index] = '\0';
printf("\n");
return pwd;
}
void show_user_info(void)
{
printf("%d %s %s\n",
users[login_index].id,
users[login_index].name,
users[login_index].phone);
anykey_continue();
}
void modify_user(void)
{
puts("*****请选择要修改的信息*****");
puts("1、修改昵称 2、修改手机号");
switch(get_cmd('1','2'))
{
case '1':
printf("请输入新的昵称:");
get_str(users[login_index].name,sizeof(users[login_index].name));
break;
case '2':
printf("请输入新的手机号:");
get_str(users[login_index].phone,sizeof(users[login_index].phone));
break;
}
printf("修改后的个人信息:");
show_user_info();
}
void modify_passwd(void)
{
char passwd[10];
printf("请输入旧密码:");
get_passwd(passwd,sizeof(passwd),true);
if(strcmp(passwd,users[login_index].passwd))
{
put_str("旧密码验证错误,无法继续!",msg_show_sec);
return;
}
printf("请输入新密码:");
get_passwd(passwd,sizeof(passwd),true);
char repasswd[10];
printf("请确认新密码:");
get_passwd(repasswd,sizeof(repasswd),true);
if(!strcmp(passwd,repasswd))
{
strcpy(users[login_index].passwd,passwd);
put_str("修改密码成功!",msg_show_sec);
return;
}
put_str("两次输入的密码不符,修改密码失败!",msg_show_sec);
}
char menu2(void)
{
system("clear");
printf("id=======%d\n",login_index);
printf("*****欢迎用户 %s 登录*****\n",users[login_index].name);
puts("1、查看信息 2、修改信息");
puts("3、修改密码 4、退出登录");
return get_cmd('1','4');
}
void login_success(void)
{
for(;;)
{
switch(menu2())
{
case '1':
show_user_info();
break;
case '2':
modify_user();
break;
case '3':
modify_passwd();
break;
case '4':
return;
}
}
}
char menu1(void)
{
system("clear");
puts("*****欢迎进入用户管理模块*****");
puts("1、注册用户 2、用户登录");
puts("3、重置密码 4、遍历用户");
puts("5、退出系统");
return get_cmd('1','5');
}
void rego_user(void)
{
if(cnt >= 100)
{
put_str("系统正在升级,暂停注册!\n",msg_show_sec);
return;
}
users[cnt].id = rand()%90000+10000;
printf("请输入昵称:");
get_str(users[cnt].name,sizeof(users[cnt].name));
printf("请输入手机号:");
get_str(users[cnt].phone,sizeof(users[cnt].phone));
for(;;)
{
printf("请输入密码(6~9位):");
get_passwd(users[cnt].passwd,sizeof(users[cnt].passwd),true);
size_t len = strlen(users[cnt].passwd);
if(len < 6)
printf("输入的密码不足6位请重新输入!");
else
break;
}
char repasswd[10];
printf("请确认密码:");
get_passwd(repasswd,sizeof(repasswd),true);
if(strcmp(users[cnt].passwd,repasswd))
{
put_str("两次输入的密码不符,添加失败!",msg_show_sec);
return;
}
// 插入排序
int index = cnt;
User back = users[index];
while(index > 0)
{
if(users[index-1].id > back.id)
users[index] = users[index-1];
else
break;
index--;
}
users[index] = back;
cnt++;
printf("新用户ID:%d\n",back.id);
put_str("添加用户成功!",msg_show_sec*2);
}
int binary_search(int key)
{
int left = 0, right = cnt-1;
while(left <= right)
{
int p = (left+right)/2;
if(users[p].id == key)
return p;
if(users[p].id > key)
right = p-1;
else
left = p+1;
}
return -1;
}
void login_user(void)
{
int id;
printf("请输入用户id:");
scanf("%d",&id);
char passwd[10];
printf("请输入用户密码:");
get_passwd(passwd,sizeof(passwd),true);
int index = binary_search(id);
if(0 <= index && !strcmp(passwd,users[index].passwd))
{
put_str("登录成功!",msg_show_sec);
login_index = index;
login_success();
return;
}
put_str("用户名或密码错误,请检查!",msg_show_sec);
}
void reset_user(void)
{
int id;
printf("请输入用户ID:");
scanf("%d",&id);
char name[20];
printf("请输入用户昵称:");
get_str(name,sizeof(name));
char phone[12];
printf("请输入用户手机号:");
get_str(phone,sizeof(phone));
int index = binary_search(id);
if(0 <=index && !strcmp(name,users[index].name)
&& !strcmp(phone,users[index].phone))
{
strcpy(users[index].passwd,"666666");
put_str("重置密码成功!",msg_show_sec);
return;
}
put_str("部分信息错误,重置密码失败!",msg_show_sec);
}
void show_user(void)
{
if(cnt <= 0)
{
put_str("暂无用户显示!",msg_show_sec);
return;
}
for(int i=0; i<cnt; i++)
{
printf("%d %s %s %s\n",
users[i].id,
users[i].name,
users[i].passwd,
users[i].phone);
}
anykey_continue();
}
void save(void)
{
FILE* fp = fopen("ms.bin","w");
if(NULL == fp)
{
put_str("保存数据失败!",msg_show_sec);
return;
}
int ret = fwrite(users,sizeof(users[0]),cnt,fp);
printf("成功保存 %d 条数据!\n",ret);
fclose(fp);
}
void load(void)
{
FILE* fp = fopen("ms.bin","r");
if(NULL == fp)
{
put_str("加载数据失败!",msg_show_sec);
return;
}
cnt = fread(users,sizeof(users[0]),100,fp);
printf("成功读取 %d 条数据!\n",cnt);
fclose(fp);
}
int main(int argc,const char* argv[])
{
load();
for(;;)
{
switch(menu1()-'0')
{
case 1:
rego_user();
break;
case 2:
login_user();
break;
case 3:
reset_user();
break;
case 4:
show_user();
break;
case 5:
save();
return 0;
}
}
}