使用链表写一个C程序,登陆注册模块,需要验证账号信息是否存在正确,数据需要写入文件

时间: 2023-08-31 09:41:35 浏览: 59
### 回答1: 好的,以下是使用链表写的C程序,包含登陆和注册模块,并且能够将账号信息写入文件: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> struct User { char username[20]; char password[20]; struct User* next; }; struct User* createUser(char username[], char password[]) { struct User* newUser = (struct User*)malloc(sizeof(struct User)); strcpy(newUser->username, username); strcpy(newUser->password, password); newUser->next = NULL; return newUser; } void saveUsersToFile(struct User* head) { FILE* file = fopen("users.txt", "w"); struct User* current = head; while (current != NULL) { fprintf(file, "%s %s\n", current->username, current->password); current = current->next; } fclose(file); } struct User* loadUsersFromFile() { struct User* head = NULL; FILE* file = fopen("users.txt", "r"); if (file == NULL) { return NULL; } char username[20]; char password[20]; while (fscanf(file, "%s %s", username, password) == 2) { struct User* user = createUser(username, password); if (head == NULL) { head = user; } else { struct User* current = head; while (current->next != NULL) { current = current->next; } current->next = user; } } fclose(file); return head; } int main() { struct User* head = loadUsersFromFile(); while (1) { int choice; printf("请选择操作:\n"); printf("1. 注册\n"); printf("2. 登陆\n"); printf("3. 退出\n"); scanf("%d", &choice); if (choice == 1) { char username[20]; char password[20]; printf("请输入用户名:"); scanf("%s", username); printf("请输入密码:"); scanf("%s", password); struct User* user = createUser(username, password); if (head == NULL) { head = user; } else { struct User* current = head; while (current->next != NULL) { current = current->next; } current->next = user; } saveUsersToFile(head); printf("注册成功!\n"); } else if (choice == 2) { char username[20]; char password[20]; printf("请输入用户名:"); scanf("%s", username); printf("请输入密码:"); scanf("%s", password); struct User* current = head; int found = 0; while (current != NULL) { if (strcmp(current->username, username) == 0 && strcmp(current->password, password) == 0) { found = 1; break; } current = current->next; } if (found) { printf("登陆成功!\n"); } else { printf("用户名或密码错误!\n"); } } else if (choice == 3) { break; } else { printf("无效的选择!\n"); } } return 0; } ``` 这个程序使用了链表来存储用户信息,并且可以将用户信息写入文件以便 ### 回答2: 使用链表写一个C程序,实现登陆注册模块,需要验证账号信息是否存在且正确,并将数据写入文件中。 首先,我们需要定义一个链表节点的结构体,包含账号名和密码两个成员变量,还包括指向下一个节点的指针。 ```c typedef struct ListNode { char username[20]; char password[20]; struct ListNode* next; } ListNode; ``` 接下来,我们定义链表的头节点和其他相关变量。 ```c ListNode* head = NULL; // 头节点指针 ListNode* last = NULL; // 尾节点指针 FILE* fp; // 文件指针 ``` 然后,我们实现注册函数,将输入的账号名和密码加入到链表中。 ```c void registerUser(char* username, char* password) { ListNode* newNode = (ListNode*)malloc(sizeof(ListNode)); strcpy(newNode->username, username); strcpy(newNode->password, password); newNode->next = NULL; if (head == NULL) { head = newNode; last = newNode; } else { last->next = newNode; last = newNode; } // 将新节点写入文件 fp = fopen("user_data.txt", "a"); fprintf(fp, "%s %s\n", newNode->username, newNode->password); fclose(fp); } ``` 接着,我们实现登录函数,验证账号名和密码是否匹配。 ```c int loginUser(char* username, char* password) { ListNode* currentNode = head; while (currentNode != NULL) { if (strcmp(currentNode->username, username) == 0 && strcmp(currentNode->password, password) == 0) return 1; // 登录成功 currentNode = currentNode->next; } return 0; // 登录失败 } ``` 最后,我们可以在主函数中进行测试,并根据返回值判断登录是否成功。 ```c int main() { registerUser("Alice", "123"); registerUser("Bob", "456"); if (loginUser("Alice", "123")) printf("登录成功!\n"); else printf("登录失败!\n"); if (loginUser("Alice", "111")) printf("登录成功!\n"); else printf("登录失败!\n"); return 0; } ``` 这样,我们就可以使用链表实现一个简单的登陆注册模块,验证账号信息是否存在正确,并将数据写入文件。 ### 回答3: 下面是使用链表写一个C程序的登录注册模块的示例,实现了验证账号信息是否存在并且正确,并将数据写入文件。 ```C #include <stdio.h> #include <stdlib.h> #include <string.h> // 用户数据结构 typedef struct User { char username[20]; char password[20]; struct User* next; } User; // 保存用户数据到文件 void saveToFile(User* users) { FILE* file = fopen("users.txt", "w"); User* current = users; while (current != NULL) { fprintf(file, "%s|%s\n", current->username, current->password); current = current->next; } fclose(file); } // 从文件中加载用户数据 User* loadFromFile() { FILE* file = fopen("users.txt", "r"); User* users = NULL; User* tail = NULL; char username[20]; char password[20]; while (fscanf(file, "%[^|]|%s\n", username, password) != EOF) { User* newUser = (User*)malloc(sizeof(User)); strcpy(newUser->username, username); strcpy(newUser->password, password); newUser->next = NULL; if (users == NULL) { users = newUser; tail = newUser; } else { tail->next = newUser; tail = newUser; } } fclose(file); return users; } // 释放链表内存 void freeList(User* users) { User* current = users; while (current != NULL) { User* temp = current; current = current->next; free(temp); } } // 验证账号信息是否正确 User* authenticate(User* users, const char* username, const char* password) { User* current = users; while (current != NULL) { // 找到匹配的用户名和密码 if (strcmp(current->username, username) == 0 && strcmp(current->password, password) == 0) { return current; } current = current->next; } return NULL; } // 注册新用户 void registerUser(User** users, const char* username, const char* password) { User* newUser = (User*)malloc(sizeof(User)); strcpy(newUser->username, username); strcpy(newUser->password, password); newUser->next = *users; *users = newUser; saveToFile(*users); } int main() { User* users = loadFromFile(); // 登录验证示例 char username[20]; char password[20]; printf("请输入用户名:"); scanf("%s", username); printf("请输入密码:"); scanf("%s", password); User* loggedInUser = authenticate(users, username, password); if (loggedInUser != NULL) { printf("登录成功!\n"); } else { printf("用户名或密码错误!\n"); } // 注册示例 char newUsername[20]; char newPassword[20]; printf("请输入新用户名:"); scanf("%s", newUsername); printf("请输入新密码:"); scanf("%s", newPassword); registerUser(&users, newUsername, newPassword); // 释放内存并保存数据到文件 freeList(users); return 0; } ``` 在这个示例中,使用了一个链表来保存用户的账号信息,并通过文件来进行数据的读取和保存。具体实现了以下功能: 1. 从文件中加载用户数据到链表中; 2. 验证用户的账号信息是否正确,并返回对应的用户; 3. 注册新用户,将新用户的账号信息添加到链表中,并保存数据到文件; 4. 释放链表内存并保存数据到文件。 请注意,该示例为简化版,没有包含数据输入的验证、密码的加密和其他一些安全措施。在实际应用中,还需要对用户的输入进行合法性检查,并对敏感信息进行加密存储。

相关推荐

最新推荐

recommend-type

C语言数据结构实现链表逆序并输出

主要介绍了C语言数据结构实现链表逆序并输出的相关资料,需要的朋友可以参考下
recommend-type

C语言:一元多项式加减法运算(链表 附答案).docx

C语言链表的入门题,里面提供了两种思路供参考,用链表来实现一元多项式的加减法,并按照一定规律输出。也是练习链表和排序算法的一道小实验,初学链表的小伙伴可以参考参考噢
recommend-type

C语言链表题目(附答案).docx

大一初学C语言时的期末作业,涉及到链表的建立和功能的实现,涉及指针、函数、动态结构建立等方面的知识,初学者可以参考参考尝试尝试哟!!!
recommend-type

数据结构实验报告之一元多项式求和(链表)报告2.doc

把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。 实验内容: 1.问题描述: 一元多项式求和——把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。
recommend-type

2层设计-2.4G RF高频信号收发模块硬件(cadence原理图+PADS PCB图+BOM)文件.zip

2层设计-2.4G RF高频信号收发模块硬件(cadence原理图+PADS PCB图+BOM)文件,可供学习及设计参考。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解答下列问题:S—>S;T|T;T—>a 构造任意项目集规范族,构造LR(0)分析表,并分析a;a

对于这个文法,我们可以构造以下项目集规范族: I0: S -> .S S -> .T T -> .a I1: S -> S. [$ T -> T. [$ I2: S -> T. I3: S -> S.;S S -> S.;T T -> T.;a 其中,点(.)表示已经被扫描过的符号,;$表示输入串的结束符号。 根据项目集规范族,我们可以构造出LR(0)分析表: 状态 | a | $ ---- | - | - I0 | s3| I1 | |acc I2 | | 其中s3表示移进到状态3,acc表示接受。在分析字符串a;a时,我们可以按照以下步骤进行
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。