// 注册函数 void register_user(User users[], int user_num) { char username[MAX_USERNAME_LEN],password[MAX_PASSWORD_LEN]; printf("请输入用户名:"); scanf("%s", username); // 检查用户名是否已存在 for (int i = 0; i < user_num; i++) { if (strcmp(users[i].username, username) == 0) { printf("注册失败,用户名已存在!\n"); return; } } printf("请输入密码:"); scanf("%s", password); strcpy(users[user_num].username, username); strcpy(users[user_num].password, password); printf("注册成功!\n"); }
时间: 2024-03-31 09:35:59 浏览: 32
这是一个注册函数,其作用是向用户数组中添加新用户。函数接受两个参数,第一个参数是指向用户数组的指针,第二个参数是表示已经注册的用户数量的整数。
函数首先提示用户输入用户名和密码,并检查用户名是否已存在于已注册的用户数组中。如果用户名已存在,则打印错误消息并返回,否则将新用户的用户名和密码复制到用户数组中,并打印注册成功的消息。
该函数使用了C语言的字符串库函数strcmp和strcpy,分别用于比较和复制字符串。在使用这些函数时,需要包含< string.h>头文件。
相关问题
void register_user(User users[], int user_num) { if (user_num >= MAX_USER_NUM) { printf("注册失败,用户数量已达上限!\n"); return; } char username[MAX_USERNAME_LEN], password[MAX_PASSWORD_LEN]; printf("请输入用户名:"); scanf("%s", username); // 检查用户名是否已存在 for (int i = 0; i < user_num; i++) { if (strcmp(users[i].username, username) == 0) { printf("注册失败,用户名已存在!\n"); return; } } printf("请输入密码:"); scanf("%s", password); strcpy(users[user_num].username, username); strcpy(users[user_num].password, password); printf("注册成功!\n"); }有什么问题
这段代码存在一些安全问题。具体来说,使用scanf函数读取用户输入时,没有指定输入字符的最大长度,可能导致缓冲区溢出问题,从而被黑客利用进行恶意攻击。为了避免这种情况,应该使用带有长度限制的函数,如fgets函数来读取用户输入,或者使用scanf函数的 %s 限定符来指定最大长度,如 scanf("%10s", username)。此外,该函数也没有对用户输入的密码进行加密处理,密码以明文形式存储在数组中,也存在安全隐患。应该使用安全的加密算法来加密密码,并且不要在程序中明文保存密码。
用c语言实现用户登录模块并可以注册,密码能够储存
以下是一个简单的基于文件存储的用户登录模块和注册模块的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_USERNAME_LEN 20
#define MAX_PASSWORD_LEN 20
typedef struct {
char username[MAX_USERNAME_LEN + 1];
char password[MAX_PASSWORD_LEN + 1];
} User;
// 从文件中读取用户信息
void read_users(User *users, int *num_users) {
FILE *fp;
fp = fopen("users.txt", "r");
if (fp == NULL) {
printf("文件打开失败\n");
return;
}
*num_users = 0;
while (fscanf(fp, "%s %s", users[*num_users].username, users[*num_users].password) == 2) {
(*num_users)++;
}
fclose(fp);
}
// 将用户信息写入文件
void write_users(User *users, int num_users) {
FILE *fp;
fp = fopen("users.txt", "w");
if (fp == NULL) {
printf("文件打开失败\n");
return;
}
for (int i = 0; i < num_users; i++) {
fprintf(fp, "%s %s\n", users[i].username, users[i].password);
}
fclose(fp);
}
// 检查用户名和密码是否匹配
int check_user(User *users, int num_users, char *username, char *password) {
for (int i = 0; i < num_users; i++) {
if (strcmp(users[i].username, username) == 0 && strcmp(users[i].password, password) == 0) {
return 1;
}
}
return 0;
}
// 注册新用户
void register_user(User *users, int *num_users) {
char username[MAX_USERNAME_LEN + 1];
char password[MAX_PASSWORD_LEN + 1];
printf("请输入用户名:");
scanf("%s", username);
for (int i = 0; i < *num_users; i++) {
if (strcmp(users[i].username, username) == 0) {
printf("用户名已存在,请重新输入!\n");
return;
}
}
printf("请输入密码:");
scanf("%s", password);
strcpy(users[*num_users].username, username);
strcpy(users[*num_users].password, password);
(*num_users)++;
printf("注册成功!\n");
}
int main() {
User users[100];
int num_users;
read_users(users, &num_users);
while (1) {
int choice;
printf("请选择操作:\n");
printf("1. 登录\n");
printf("2. 注册\n");
printf("3. 退出\n");
scanf("%d", &choice);
if (choice == 1) {
char username[MAX_USERNAME_LEN + 1];
char password[MAX_PASSWORD_LEN + 1];
printf("请输入用户名:");
scanf("%s", username);
printf("请输入密码:");
scanf("%s", password);
if (check_user(users, num_users, username, password)) {
printf("登录成功!\n");
} else {
printf("用户名或密码错误!\n");
}
} else if (choice == 2) {
register_user(users, &num_users);
} else if (choice == 3) {
write_users(users, num_users);
break;
} else {
printf("输入错误,请重新输入!\n");
}
}
return 0;
}
```
以上代码中,我们增加了一个 `write_users` 函数用于将用户信息写入文件。在 `register_user` 函数中,我们首先通过 `scanf` 函数获取新用户的用户名和密码,然后检查用户名是否已存在。如果用户名已存在,则输出提示信息并返回;否则将新用户信息存储到 `users` 数组中,并将 `num_users` 增加 1。在 `main` 函数中,我们增加了一个循环来实现用户交互。用户可以选择登录、注册或退出程序。程序退出时,我们调用 `write_users` 函数将用户信息写入文件。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![c](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)