C语言利用链表与文件实现登录注册功能

yizhihongxing

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技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • office2016最新安装及激活教程(kms)【亲测有效】!!

    Office 2016最新安装及激活教程(KMS)【亲测有效】!! 介绍 Microsoft Office 2016是目前最流行的一款办公软件套装,其拥有许多实用的功能和便捷的操作,使得它成为了广大用户工作和生活中必不可少的工具之一。本篇文章将详细介绍如何进行Office 2016的最新安装及KMS激活,以便更好的使用Office 2016。 系统要求 在进…

    其他 2023年3月29日
    00
  • Android动态添加设置布局与控件的方法

    当我们需要根据具体的情况在运行时动态添加布局和控件时,可以采用以下的步骤来实现: 1. 获取布局容器 首先需要获取一个布局容器,可以通过调用 findViewById() 方法获取已经存在的布局容器,例如: LinearLayout layout = findViewById(R.id.layout_container); 2. 创建布局参数 接下来需要创建…

    other 2023年6月27日
    00
  • php is_file 判断给定文件名是否为一个正常的文件

    PHP 的 is_file 函数可用于判断一个给定的文件名是否为一个正常的文件。其语法如下: bool is_file(string $filename) $filename:要判断的文件名称。 若该文件存在且是一个普通文件,is_file($filename) 返回 true,否则返回 false。 示例 1: $filename = ‘/path/to/…

    other 2023年6月26日
    00
  • ora-00119和ora-00132问题的解决方法

    解决 ORA-00119 和 ORA-00132 问题 介绍 ORA-00119 和 ORA-00132 都是 Oracle 数据库中连接管理器出现问题的错误信息。其中 ORA-00119 错误提示表示连接管理器无法从那台主机上启动,而 ORA-00132 错误提示表示连接管理器接收到一个错误指令,导致连接失败。这两个错误都可能导致连接管理器无法正常工作,进…

    other 2023年6月27日
    00
  • 基于结构体与指针的详解

    基于结构体与指针的详解 在C语言中,结构体和指针是两个重要的概念。结构体允许我们将不同类型的数据组合在一起,而指针则允许我们有效地操作和传递数据。本攻略将详细讲解基于结构体与指针的相关知识。 结构体 结构体是一种用户自定义的数据类型,它允许我们将不同类型的数据组合在一起,形成一个新的数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型。 定义结构体 …

    other 2023年8月8日
    00
  • Spring AOP 对象内部方法间的嵌套调用方式

    Spring AOP 对象内部方法间的嵌套调用方式 Spring AOP(面向切面编程)是一种在应用程序中实现横切关注点的技术。它允许开发人员通过将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,以提高代码的可维护性和可重用性。在Spring AOP中,我们可以使用切面(Aspect)来定义横切关注点,并将其应用于目标对象的方法。 1. 定义切面 …

    other 2023年7月27日
    00
  • 鸿蒙开源第三方组件之连续滚动图像组件功能

    下面是“鸿蒙开源第三方组件之连续滚动图像组件功能”的完整攻略: 一、介绍 鸿蒙开源第三方组件中,已经有了一些非常实用的图像组件,但是在实际的开发中,我们有时需要实现一些连续滚动的图像展示,这时就可以使用鸿蒙开源第三方组件之连续滚动图像组件。 该组件可以自动进行图像轮播,也可以手动进行停止、开始等操作。 二、使用方式 2.1 下载组件 首先需要在代码中引入该组…

    other 2023年6月27日
    00
  • 关于QT应用在XP系统上兼容运行的问题

    关于QT应用在XP系统上兼容运行的问题 背景概述 QT是一个跨平台的C++GUI应用程序开发框架,但是在XP系统上兼容性存在一定问题,导致一些QT应用在XP系统上无法正常运行。本文旨在探讨如何解决QT应用在XP系统上的兼容性问题。 问题分析 QT应用在XP系统上出现兼容性问题的主要原因是QT版本过高或XP系统版本过旧。QT的一些新特性(如高清分辨率支持、Un…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部