请用C语言写一个简易登陆代码,功能界面有3个功能,分别为登陆 注册 退出。选择登陆功能后,输入用户名和账户和密码可以登陆上自己的账号,若有误则提示报错,并重新输入;选择注册功能时,可以输入自己的用户名(可以使用汉字,字母,数字,符号,不得超过10位),然后输入密码(密码只能由数字和字母组成,且不超过6位),且密码需要第二次确认,随后注册成功,随机生成一个6位数的账号,每次注册所产生的用户名,账号,密码等数据需要保存,以便登陆时使用。选择退出功能时,退出
时间: 2024-03-16 19:46:52 浏览: 66
以下是一个简易的登陆系统代码,包含登陆、注册和退出三个功能。请注意,该代码仅作为参考,实际应用中需要加上更多的安全检查和数据存储功能。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_USER_NUM 100
#define MAX_USER_NAME_LEN 10
#define MAX_PASSWORD_LEN 6
typedef struct User {
char name[MAX_USER_NAME_LEN + 1];
int account;
char password[MAX_PASSWORD_LEN + 1];
} User;
User users[MAX_USER_NUM];
int user_num = 0;
int is_valid_name(const char* name) {
int len = strlen(name);
if (len == 0 || len > MAX_USER_NAME_LEN) return 0;
for (int i = 0; i < len; i++) {
if (!((name[i] >= '0' && name[i] <= '9') ||
(name[i] >= 'a' && name[i] <= 'z') ||
(name[i] >= 'A' && name[i] <= 'Z') ||
(name[i] >= 0x4E00 && name[i] <= 0x9FA5))) {
return 0;
}
}
return 1;
}
int is_valid_password(const char* password) {
int len = strlen(password);
if (len == 0 || len > MAX_PASSWORD_LEN) return 0;
for (int i = 0; i < len; i++) {
if (!((password[i] >= '0' && password[i] <= '9') ||
(password[i] >= 'a' && password[i] <= 'z') ||
(password[i] >= 'A' && password[i] <= 'Z'))) {
return 0;
}
}
return 1;
}
int find_user(const char* name) {
for (int i = 0; i < user_num; i++) {
if (strcmp(users[i].name, name) == 0) {
return i;
}
}
return -1;
}
void register_user() {
char name[MAX_USER_NAME_LEN + 1];
char password[MAX_PASSWORD_LEN + 1];
char confirm[MAX_PASSWORD_LEN + 1];
printf("Please enter your username (up to %d characters):\n", MAX_USER_NAME_LEN);
scanf("%s", name);
if (!is_valid_name(name)) {
printf("Invalid username!\n");
return;
}
if (find_user(name) != -1) {
printf("Username already exists!\n");
return;
}
printf("Please enter your password (up to %d characters, only letters and digits allowed):\n", MAX_PASSWORD_LEN);
scanf("%s", password);
if (!is_valid_password(password)) {
printf("Invalid password!\n");
return;
}
printf("Please confirm your password:\n");
scanf("%s", confirm);
if (strcmp(password, confirm) != 0) {
printf("Passwords don't match!\n");
return;
}
User user;
strcpy(user.name, name);
user.account = rand() % 900000 + 100000;
strcpy(user.password, password);
users[user_num++] = user;
printf("Registration successful! Your account is %d.\n", user.account);
}
void login() {
char name[MAX_USER_NAME_LEN + 1];
char password[MAX_PASSWORD_LEN + 1];
printf("Please enter your username:\n");
scanf("%s", name);
int index = find_user(name);
if (index == -1) {
printf("User does not exist!\n");
return;
}
printf("Please enter your password:\n");
scanf("%s", password);
if (strcmp(users[index].password, password) != 0) {
printf("Wrong password!\n");
return;
}
printf("Login successful! Welcome, %s.\n", name);
}
void display_menu() {
printf("Welcome to the login system!\n");
printf("Please select an option:\n");
printf("1. Login\n");
printf("2. Register\n");
printf("3. Exit\n");
}
int main() {
srand((unsigned)time(NULL));
int choice;
do {
display_menu();
scanf("%d", &choice);
switch (choice) {
case 1:
login();
break;
case 2:
register_user();
break;
case 3:
printf("Goodbye!\n");
break;
default:
printf("Invalid choice!\n");
}
} while (choice != 3);
return 0;
}
```
在以上代码中,我们定义了一个 `User` 结构体来保存用户的信息,包括用户名、账号和密码。我们使用了一个 `users` 数组来保存所有注册的用户,使用一个 `user_num` 变量来记录当前有多少个用户。在程序启动时,我们需要调用 `srand` 函数来初始化随机数生成器,以便在注册时随机生成账号。
在 `is_valid_name` 和 `is_valid_password` 函数中,我们分别检查用户名和密码是否合法,合法的用户名可以包括汉字、字母、数字和符号,但长度不得超过 `MAX_USER_NAME_LEN` 个字符;合法的密码只能由字母和数字组成,但长度不得超过 `MAX_PASSWORD_LEN` 个字符。
在 `find_user` 函数中,我们遍历所有已注册的用户,查找指定用户名的用户是否存在。若存在,返回其在 `users` 数组中的下标,否则返回 `-1`。
在 `register_user` 函数中,我们首先要求用户输入用户名,如果不合法或者已存在,则提示报错并退出;接着要求用户输入密码,并进行检查,如果不合法或者密码不一致,则提示报错并退出;最后随机生成账号,并将用户信息保存到 `users` 数组中。
在 `login` 函数中,我们要求用户输入用户名和密码,如果用户名不存在或者密码不正确,则提示报错并退出,否则登录成功。
在 `display_menu` 函数中,我们显示程序的菜单,让用户选择要进行的操作。
在 `main` 函数中,我们在程序启动时调用 `srand` 函数,然后进入菜单循环,让用户选择要进行的操作。若用户选择退出,则退出循环,结束程序。
阅读全文