C语言利用链表与文件实现登录注册功能攻略
1. 简介
本攻略旨在介绍如何利用链表与文件实现登录注册功能。具体而言,我们将通过C语言实现一个简单的用户登录注册系统,所有用户信息将存储在文件中,并使用链表进行管理。该系统应具有以下功能:
- 注册新用户;
- 查询已注册用户;
- 用户登录;
- 修改用户密码;
- 删除用户。
2. 设计
2.1 用户信息结构体
为管理用户信息,我们需要一个结构体来存储用户相关信息,如下所示:
struct user {
char username[20];
char password[20];
struct user *next;
};
其中,username
保存用户名称,password
保存用户密码,next
指向下一个用户信息结点。
2.2 文件管理
我们将用户信息保存在文件中,文件名为user.txt
,每行代表一个用户的信息,格式为:
username,password
因此,我们需要针对文件进行以下操作:
- 读取文件,加载已经注册的用户信息;
- 写入文件,注册新用户。
2.3 链表管理
为实现对用户信息的管理,我们使用链表对已注册用户进行存储,并进行增删查改等操作。
2.4 用户操作界面
为方便用户使用,我们以命令行方式提供用户操作界面,具体命令及功能如下:
register
:注册新用户;query
:查询已注册用户;login
:用户登录;modify
:修改用户密码;delete
:删除用户。
3. 实现步骤
以下为主要实现步骤:
3.1 文件读取
在程序启动时,读取用户信息文件user.txt
,加载已经注册的用户信息到链表中。
void read_users(struct user **head) {
FILE *fp = fopen("user.txt", "r");
char buf[50];
while (fgets(buf, 50, fp)) {
char* username = strtok(buf, ",");
char* password = strtok(NULL, ",");
register_user(head, username, password); // 注册到链表中
}
fclose(fp);
}
3.2 注册新用户
用户输入命令register
后,用户输入用户名和密码,程序将新用户信息写入文件并写入链表。
void register() {
struct user *new_user;
new_user = (struct user *) malloc(sizeof(struct user));
printf("Input Username: ");
scanf("%s", new_user->username);
printf("Input Password: ");
scanf("%s", new_user->password);
new_user->next = NULL;
register_user(&head, new_user->username, new_user->password); // 注册到链表中
write_user(new_user); // 写入文件
}
3.3 按用户名注册
若用户名已经存在,则注册失败。实现如下:
void register_user(struct user **head, char *username, char *password) {
struct user *p = *head;
while (p) {
if (strcmp(p->username, username) == 0) {
printf("User already exists!\n");
return;
}
p = p->next;
}
struct user *new_user;
new_user = (struct user *) malloc(sizeof(struct user));
strcpy(new_user->username, username);
strcpy(new_user->password, password);
new_user->next = *head;
*head = new_user;
}
3.4 查询已注册用户
用户输入命令query
后,程序将已注册用户信息输出到屏幕。
void query() {
struct user *p = head;
while (p) {
printf("%s\n", p->username);
p = p->next;
}
}
3.5 用户登录
用户输入命令login
后,用户输入用户名和密码,程序在链表中查找该用户,若存在则登录成功。
void login() {
char username[20];
char password[20];
printf("Input Username: ");
scanf("%s", &username);
printf("Input Password: ");
scanf("%s", &password);
struct user *p = head;
while (p) {
if (strcmp(p->username, username) == 0 && strcmp(p->password, password) == 0) {
printf("Login successful!\n");
return;
}
p = p->next;
}
printf("Login failed, incorrect username or password.\n");
return;
}
3.6 修改用户密码
用户输入命令modify
后,用户输入要修改密码的用户名和新密码,程序在链表中查找该用户,若存在则将密码修改为新密码。
void modify() {
char username[20];
char password[20];
printf("Input Username: ");
scanf("%s", &username);
printf("Input new Password: ");
scanf("%s", &password);
struct user *p = head;
while (p) {
if (strcmp(p->username, username) == 0) {
strcpy(p->password, password); // 修改密码
printf("Password modified successfully!\n");
return;
}
p = p->next;
}
printf("User does not exist, password modification failed.\n");
return;
}
3.7 删除用户
用户输入命令delete
后,用户输入要删除的用户名,程序在链表中查找该用户,若存在则将该用户从链表中删除。
void delete() {
char username[20];
printf("Input Username to delete: ");
scanf("%s", &username);
struct user *p = head;
struct user *pre = NULL;
while (p) {
if (strcmp(p->username, username) == 0) {
if (pre == NULL) { // 删除表头结点
head = p->next;
} else {
pre->next = p->next;
}
printf("User %s deleted successfully!\n", username);
free(p);
return;
}
pre = p;
p = p->next;
}
printf("User does not exist, delete failed.\n");
return;
}
4. 示例说明
4.1 示例一
用户登录:
Input Username: alice
Input Password: 123456
Login successful!
修改密码:
Input Username: alice
Input new Password: 111111
Password modified successfully!
4.2 示例二
注册新用户:
Input Username: bob
Input Password: 654321
查询已注册用户:
alice
bob
删除用户:
Input Username to delete: bob
User bob deleted successfully!
5. 总结
本攻略详细介绍了如何利用链表与文件实现登录注册功能。通过实现一个综合性较强的用户登录注册系统,不仅加深了对数据结构的理解,同时对C语言编程能力的提升也有一定的帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言利用链表与文件实现登录注册功能 - Python技术站