自学内容网 自学内容网

48 C 语言实战项目——客户信息管理系统

目录

1 需求说明

1.1 主菜单

1.2 添加客户

1.3 显示客户列表

1.4 修改客户

1.5 删除客户

1.6 退出

2 流程分析

2.1 总流程图

2.2 添加客户流程图

2.3 显示客户列表流程图

2.4 改客户流程图

2.4.1 修改客户总体流程图

2.4.2 具体执行修改部分的流程图

2.5 删除客户流程图

2.6 退出流程图

3 代码实现

3.1 框架搭建

3.2 结构体与菜单页面的抽取

3.3 退出功能

3.4 显示客户列表功能

3.5 添加客户功能

3.6 删除客户功能

3.7 修改客户功能

4 最终优化后的代码

 


1 需求说明

1.1 主菜单

        进入系统,展示主菜单,输入各功能对应的数字编号选择要进行的操作,如下图:

1.2 添加客户

        输入1,进入“添加客户” 界面,需要填写姓名、性别、年龄、电话、邮箱这些信息,如下图:

1.3 显示客户列表

        输入 4,进入“客户列表”,显示客户列表信息,如下图:

1.4 修改客户

        输入 2,进入“修改客户”,首先要输入要修改客户的编号,然后填写信息,如下图:

1.5 删除客户

        输入 3,进入“删除客户”,输入要删除客户的编号,再确认是否删除,如下图:

1.6 退出

        输出 5,经过确认后退出系统,如下图:


2 流程分析

2.1 总流程图

2.2 添加客户流程图

2.3 显示客户列表流程图

2.4 改客户流程图

2.4.1 修改客户总体流程图

2.4.2 具体执行修改部分的流程图

2.5 删除客户流程图

2.6 退出流程图


3 代码实现

3.1 框架搭建

#include <stdio.h>

int main()
{
    int loop = 1; // 控制循环是否继续的变量
    while (loop)  // 主循环,用于显示菜单直到用户选择退出
    {
        // 显示菜单
        printf("\n\n\n--------------客户信息管理软件--------------");
        printf("\n               1 添 加 客 户");
        printf("\n               2 修 改 客 户");
        printf("\n               3 删 除 客 户");
        printf("\n               4 客 户 列 表");
        printf("\n               5 退       出");
        printf("\n请选择(1-5):");

        int selection; // 存储用户的选项
        // 使用 scanf 读取用户输入
        if (scanf("%d", &selection) != 1) // 如果输入不是整数
        {
            puts("无效的输入,请输入一个数字 (1-5)!"); // 提示错误信息
            // 清理输入缓冲区中的非数字字符
            while (getchar() != '\n')
                ;
            continue; // 跳过本次循环的剩余部分,重新开始循环
        }
        // 根据用户选择执行相应操作
        switch (selection)
        {
        case 1:
            puts("添 加 客 户"); // 用户选择了添加客户
            break;
        case 2:
            puts("修 改 客 户"); // 用户选择了修改客户
            break;
        case 3:
            puts("删 除 客 户"); // 用户选择了删除客户
            break;
        case 4:
            puts("客 户 列 表"); // 用户选择了查看客户列表
            break;
        case 5:
            puts("退       出"); // 用户选择了退出程序
            loop = 0;            // 设置 loop 为 0 以结束主循环
            break;
        default:
            puts("无效的选择,请重新选择!"); // 用户输入了不在 1-5 范围内的数字
            break;
        }
    }

    // 提示用户已退出软件
    puts("你退出了客户管理系统~");

    return 0; // 程序正常结束
}

3.2 结构体与菜单页面的抽取

#include <stdio.h>
#define MAX_CAPACITY 100 // 客户数量的最大值

// 定义结构体数据类型来存储客户信息
struct Customer
{
    int id;         // 客户编号
    char name[10];  // 客户名字
    char gender;    // 性别,'f' 表示女,'m' 表示男
    int age;        // 年龄
    char phone[20]; // 电话号码
    char email[40]; // 邮箱地址
};

// 客户结构体数组,最多可以存储 100 个客户信息
struct Customer customers[MAX_CAPACITY];

// 当前客户数量,用于索引数组
int customerNum = 0;

// 显示菜单并处理用户选择的函数
void menu()
{
    int loop = 1; // 控制主循环是否继续的变量
    while (loop)  // 主循环,持续显示菜单直到用户选择退出
    {
        // 显示菜单选项
        printf("\n\n\n--------------客户信息管理软件--------------");
        printf("\n               1 添 加 客 户");
        printf("\n               2 修 改 客 户");
        printf("\n               3 删 除 客 户");
        printf("\n               4 客 户 列 表");
        printf("\n               5 退       出");
        printf("\n请选择(1-5):");

        int selection; // 存储用户的选项
        // 使用 scanf 读取用户输入
        if (scanf("%d", &selection) != 1) // 如果输入不是整数
        {
            puts("无效的输入,请输入一个数字 (1-5)!"); // 提示错误信息
            // 清理输入缓冲区中的非数字字符
            while (getchar() != '\n')
                ;
            continue; // 跳过本次循环的剩余部分,重新开始循环
        }
        // 根据用户选择执行相应操作
        switch (selection)
        {
        case 1:
            puts("添 加 客 户"); // 用户选择了添加客户
            break;
        case 2:
            puts("修 改 客 户"); // 用户选择了修改客户
            break;
        case 3:
            puts("删 除 客 户"); // 用户选择了删除客户
            break;
        case 4:
            puts("客 户 列 表"); // 用户选择了查看客户列表
            break;
        case 5:
            puts("退       出"); // 用户选择了退出程序
            loop = 0;            // 设置 loop 为 0 以结束主循环
            break;
        default:
            puts("无效的选择,请重新选择!"); // 用户输入了不在 1-5 范围内的数字
            break;
        }
    }
}

int main()
{
    menu(); // 调用菜单函数

    // 提示用户已退出软件
    puts("你退出了客户管理系统~");

    return 0; // 程序正常结束
}

3.3 退出功能

#include <stdio.h>
#define MAX_CAPACITY 100 // 客户数量的最大值

// 定义结构体数据类型来存储客户信息
struct Customer
{
    int id;         // 客户编号
    char name[10];  // 客户名字
    char gender;    // 性别,'f' 表示女,'m' 表示男
    int age;        // 年龄
    char phone[20]; // 电话号码
    char email[40]; // 邮箱地址
};

int loop = 1; // 全局变量控制主循环是否继续的变量

// 客户结构体数组,最多可以存储 100 个客户信息
struct Customer customers[MAX_CAPACITY];

// 当前客户数量,用于索引数组
int customerNum = 0;

// 确认退出函数
void confirmExit()
{
    puts("确认是否退出(Y/N):");
    char isExit;
    // 读取用户输入的确认信息
    while (1)
    {
        if (scanf(" %c", &isExit) != 1) // %c 前面有空格,用于跳过前面的空白字符
        {
            puts("无效的输入,请输入 Y 或 N!"); // 提示错误信息
            // 清理输入缓冲区
            while (getchar() != '\n')
                ;
            continue; // 跳过本次循环
        }

        // 检查用户输入是否有效
        if (isExit == 'Y' || isExit == 'N')
        {
            break; // 结束循环
        }
        else
        {
            puts("你输入有误,请从新输入(Y/N):"); // 提示重新输入
        }
    }

    // 如果用户选择退出,设置循环标志为 0
    if (isExit == 'Y')
    {
        loop = 0;
        puts("欢迎你的再次访问^_^"); // 退出提示
    }
}

// 显示菜单并处理用户选择的函数
void menu()
{
    while (loop) // 主循环,持续显示菜单直到用户选择退出
    {
        // 显示菜单选项
        printf("\n\n\n--------------客户信息管理软件--------------");
        printf("\n               1 添 加 客 户");
        printf("\n               2 修 改 客 户");
        printf("\n               3 删 除 客 户");
        printf("\n               4 客 户 列 表");
        printf("\n               5 退       出");
        printf("\n请选择(1-5):");

        int selection; // 存储用户的选项
        // 使用 scanf 读取用户输入
        if (scanf("%d", &selection) != 1) // 如果输入不是整数
        {
            puts("无效的输入,请输入一个数字 (1-5)!"); // 提示错误信息
            // 清理输入缓冲区中的非数字字符
            while (getchar() != '\n')
                ;
            continue; // 跳过本次循环的剩余部分,重新开始循环
        }
        // 根据用户选择执行相应操作
        switch (selection)
        {
        case 1:
            puts("添 加 客 户"); // 用户选择了添加客户
            break;
        case 2:
            puts("修 改 客 户"); // 用户选择了修改客户
            break;
        case 3:
            puts("删 除 客 户"); // 用户选择了删除客户
            break;
        case 4:
            puts("客 户 列 表"); // 用户选择了查看客户列表
            break;
        case 5:
            confirmExit(); // 用户选择了退出程序
            break;
        default:
            puts("无效的选择,请重新选择!"); // 用户输入了不在 1-5 范围内的数字
            break;
        }
    }
}

int main()
{
    menu(); // 调用菜单函数

    // 提示用户已退出软件
    puts("你退出了客户管理系统~");

    return 0; // 程序正常结束
}

3.4 显示客户列表功能

#include <stdio.h>
#include <string.h>

#define MAX_CAPACITY 100 // 客户数量的最大值

// 定义结构体数据类型来存储客户信息
struct Customer
{
    int id;         // 客户编号
    char name[10];  // 客户名字
    char gender;    // 性别,'f' 表示女,'m' 表示男
    int age;        // 年龄
    char phone[20]; // 电话号码
    char email[40]; // 邮箱地址
};

int loop = 1; // 全局变量控制主循环是否继续的变量

// 客户结构体数组,最多可以存储 100 个客户信息
struct Customer customers[MAX_CAPACITY];

// 当前客户数量,用于索引数组
int customerNum = 0;

// 显示某个客户的信息
void showCustomer(struct Customer *custPtr)
{
    // 两种方式访问结构体指针成员
    // 第一种方式:(*custPtr).member
    // 第二种方式:custPtr->member
    printf("%d\t%s\t%c\t%d\t%s\t\t%s\n", (*custPtr).id, custPtr->name, custPtr->gender, custPtr->age, custPtr->phone, custPtr->email);
}

// 显示客户列表的功能
void showView()
{
    if (customerNum < 1)
    {
        puts("系统中没有任何客户的信息,请先添加!");
    }
    else
    {
        puts("-------------------客户列表-------------------");
        puts("\n编号\t姓名\t\t性别\t年龄\t电话\t\t邮箱");
        // 遍历数组
        for (int i = 0; i < customerNum; i++)
        {
            showCustomer(&customers[i]); // 调用 showCustomer 函数显示每个客户的信息
        }
    }
}

// 确认退出函数
void confirmExit()
{
    puts("确认是否退出(Y/N):");
    char isExit;
    // 读取用户输入的确认信息
    while (1)
    {
        if (scanf(" %c", &isExit) != 1) // %c 前面有空格,用于跳过前面的空白字符
        {
            puts("无效的输入,请输入 Y 或 N!"); // 提示错误信息
            // 清理输入缓冲区
            while (getchar() != '\n')
                ;
            continue; // 跳过本次循环
        }

        // 检查用户输入是否有效
        if (isExit == 'Y' || isExit == 'N')
        {
            break; // 结束循环
        }
        else
        {
            puts("你输入有误,请从新输入(Y/N):"); // 提示重新输入
        }
    }

    // 如果用户选择退出,设置循环标志为 0
    if (isExit == 'Y')
    {
        loop = 0;
        puts("欢迎你的再次访问^_^"); // 退出提示
    }
}

// 显示菜单并处理用户选择的函数
void menu()
{
    while (loop) // 主循环,持续显示菜单直到用户选择退出
    {
        // 显示菜单选项
        printf("\n\n\n--------------客户信息管理软件--------------");
        printf("\n               1 添 加 客 户");
        printf("\n               2 修 改 客 户");
        printf("\n               3 删 除 客 户");
        printf("\n               4 客 户 列 表");
        printf("\n               5 退       出");
        printf("\n请选择(1-5):");

        int selection; // 存储用户的选项
        // 使用 scanf 读取用户输入
        if (scanf("%d", &selection) != 1) // 如果输入不是整数
        {
            puts("无效的输入,请输入一个数字 (1-5)!"); // 提示错误信息
            // 清理输入缓冲区中的非数字字符
            while (getchar() != '\n')
                ;
            continue; // 跳过本次循环的剩余部分,重新开始循环
        }
        // 根据用户选择执行相应操作
        switch (selection)
        {
        case 1:
            puts("添 加 客 户"); // 用户选择了添加客户
            break;
        case 2:
            puts("修 改 客 户"); // 用户选择了修改客户
            break;
        case 3:
            puts("删 除 客 户"); // 用户选择了删除客户
            break;
        case 4:
            showView(); // 用户选择了查看客户列表
            break;
        case 5:
            confirmExit(); // 用户选择了退出程序
            break;
        default:
            puts("无效的选择,请重新选择!"); // 用户输入了不在 1-5 范围内的数字
            break;
        }
    }
}

int main()
{

    // 模拟数据的添加,便于测试客户显示列表功能
    customers[0].id = 1;

    // 在 C 语言中,直接使用 = 运算符给字符数组赋值是不允许的
    // 这是因为字符数组实际上是一个指针,指向一个字符序列的起始位置
    // = 运算符只能用于初始化指针,而不能用于复制字符串内容
    // customers[0].name = "mynameis666";  错误用法

    strcpy(customers[0].name, "Thanks_ks");
    customers[0].gender = 'm';
    customers[0].age = 18;
    strcpy(customers[0].phone, "1008611");
    strcpy(customers[0].email, "1008611@qq.com");
    customerNum++;

    // 模拟数据的添加,便于测试客户显示列表功能
    customers[1].id = 2;
    strcpy(customers[1].name, "THANKS_KS");
    customers[1].gender = 'f';
    customers[1].age = 22;
    strcpy(customers[1].phone, "1001010");
    strcpy(customers[1].email, "1009999@qq.com");
    customerNum++;

    menu(); // 调用菜单函数

    // 提示用户已退出软件
    puts("你退出了客户管理系统~");

    return 0; // 程序正常结束
}

3.5 添加客户功能

#include <stdio.h>
#include <string.h>

#define MAX_CAPACITY 100 // 客户数量的最大值

// 定义结构体数据类型来存储客户信息
struct Customer
{
    int id;         // 客户编号
    char name[10];  // 客户名字
    char gender;    // 性别,'f' 表示女,'m' 表示男
    int age;        // 年龄
    char phone[20]; // 电话号码
    char email[40]; // 邮箱地址
};

int loop = 1; // 全局变量控制主循环是否继续的变量

// 客户结构体数组,最多可以存储 100 个客户信息
struct Customer customers[MAX_CAPACITY];

// 当前客户数量,用于索引数组
int customerNum = 0;

// 添加客户的功能
void addCustomer()
{
    if (customerNum < MAX_CAPACITY)
    {
        puts("---------------------添加客户---------------------");

        // struct Customer cus = customers[customerNum]; // 错误写法,相当于复制数组

        // 使用指针指向当前客户的地址,后续操作是操作的地址所指向的内容
        struct Customer *cusPtr = &customers[customerNum];

        // 编号自动累加的方式赋值
        // 注意这里不要使用 customerNum++,因为后续需要用它进行赋值
        cusPtr->id = customerNum + 1;

        // 输入客户姓名
        printf("姓名: ");
        char name[10];
        if (scanf("%9s", name) != 1) // 限制输入长度为 9,防止溢出
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        strcpy(cusPtr->name, name);

        // 输入客户性别
        printf("性别: ");
        char gender;
        if (scanf(" %c", &gender) != 1) // %c 前面有空格,用于跳过前面的空白字符
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        cusPtr->gender = gender;

        // 输入客户年龄
        printf("年龄: ");
        int age;
        if (scanf("%d", &age) != 1)
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        cusPtr->age = age;

        // 输入客户电话
        printf("电话: ");
        char phone[20];
        if (scanf("%19s", phone) != 1) // 限制输入长度为 19,防止溢出
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        strcpy(cusPtr->phone, phone);

        // 输入客户邮箱
        printf("邮箱: ");
        char email[40];
        if (scanf("%39s", email) != 1) // 限制输入长度为 39,防止溢出
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        strcpy(cusPtr->email, email);

        customerNum++; // 增加客户数量
        puts("---------------------添加完成---------------------");
    }
    else
    {
        puts("客户列表已满,添加失败");
    }
}

// 显示某个客户的信息
void showCustomer(struct Customer *custPtr)
{
    // 两种方式访问结构体指针成员
    // 第一种方式:(*custPtr).member
    // 第二种方式:custPtr->member
    printf("%d\t%s\t%c\t%d\t%s\t\t%s\n", (*custPtr).id, custPtr->name, custPtr->gender, custPtr->age, custPtr->phone, custPtr->email);
}

// 显示客户列表的功能
void showView()
{
    if (customerNum < 1)
    {
        puts("系统中没有任何客户的信息,请先添加!");
    }
    else
    {
        puts("-------------------客户列表-------------------");
        puts("\n编号\t姓名\t\t性别\t年龄\t电话\t\t邮箱");
        // 遍历数组
        for (int i = 0; i < customerNum; i++)
        {
            showCustomer(&customers[i]); // 调用 showCustomer 函数显示每个客户的信息
        }
    }
}

// 确认退出函数
void confirmExit()
{
    puts("确认是否退出(Y/N):");
    char isExit;
    // 读取用户输入的确认信息
    while (1)
    {
        if (scanf(" %c", &isExit) != 1) // %c 前面有空格,用于跳过前面的空白字符
        {
            puts("无效的输入,请输入 Y 或 N!"); // 提示错误信息
            // 清理输入缓冲区
            while (getchar() != '\n')
                ;
            continue; // 跳过本次循环
        }

        // 检查用户输入是否有效
        if (isExit == 'Y' || isExit == 'N')
        {
            break; // 结束循环
        }
        else
        {
            puts("你输入有误,请从新输入(Y/N):"); // 提示重新输入
        }
    }

    // 如果用户选择退出,设置循环标志为 0
    if (isExit == 'Y')
    {
        loop = 0;
        puts("欢迎你的再次访问^_^"); // 退出提示
    }
}

// 显示菜单并处理用户选择的函数
void menu()
{
    while (loop) // 主循环,持续显示菜单直到用户选择退出
    {
        // 显示菜单选项
        printf("\n\n\n--------------客户信息管理软件--------------");
        printf("\n               1 添 加 客 户");
        printf("\n               2 修 改 客 户");
        printf("\n               3 删 除 客 户");
        printf("\n               4 客 户 列 表");
        printf("\n               5 退       出");
        printf("\n请选择(1-5):");

        int selection; // 存储用户的选项
        // 使用 scanf 读取用户输入
        if (scanf("%d", &selection) != 1) // 如果输入不是整数
        {
            puts("无效的输入,请输入一个数字 (1-5)!"); // 提示错误信息
            // 清理输入缓冲区中的非数字字符
            while (getchar() != '\n')
                ;
            continue; // 跳过本次循环的剩余部分,重新开始循环
        }
        // 根据用户选择执行相应操作
        switch (selection)
        {
        case 1:
            addCustomer(); // 用户选择了添加客户
            break;
        case 2:
            puts("修 改 客 户"); // 用户选择了修改客户
            break;
        case 3:
            puts("删 除 客 户"); // 用户选择了删除客户
            break;
        case 4:
            showView(); // 用户选择了查看客户列表
            break;
        case 5:
            confirmExit(); // 用户选择了退出程序
            break;
        default:
            puts("无效的选择,请重新选择!"); // 用户输入了不在 1-5 范围内的数字
            break;
        }
    }
}

int main()
{

    // 模拟数据的添加,便于测试客户显示列表功能
    customers[0].id = 1;

    // 在 C 语言中,直接使用 = 运算符给字符数组赋值是不允许的
    // 这是因为字符数组实际上是一个指针,指向一个字符序列的起始位置
    // = 运算符只能用于初始化指针,而不能用于复制字符串内容
    // customers[0].name = "mynameis666";  错误用法

    strcpy(customers[0].name, "Thanks_ks");
    customers[0].gender = 'm';
    customers[0].age = 18;
    strcpy(customers[0].phone, "1008611");
    strcpy(customers[0].email, "1008611@qq.com");
    customerNum++;

    // 模拟数据的添加,便于测试客户显示列表功能
    customers[1].id = 2;
    strcpy(customers[1].name, "THANKS_KS");
    customers[1].gender = 'f';
    customers[1].age = 22;
    strcpy(customers[1].phone, "1001010");
    strcpy(customers[1].email, "1009999@qq.com");
    customerNum++;

    menu(); // 调用菜单函数

    // 提示用户已退出软件
    puts("你退出了客户管理系统~");

    return 0; // 程序正常结束
}

3.6 删除客户功能

#include <stdio.h>
#include <string.h>

#define MAX_CAPACITY 100 // 客户数量的最大值

// 定义结构体数据类型来存储客户信息
struct Customer
{
    int id;         // 客户编号
    char name[10];  // 客户名字
    char gender;    // 性别,'f' 表示女,'m' 表示男
    int age;        // 年龄
    char phone[20]; // 电话号码
    char email[40]; // 邮箱地址
};

int loop = 1; // 全局变量控制主循环是否继续的变量

// 客户结构体数组,最多可以存储 100 个客户信息
struct Customer customers[MAX_CAPACITY];

// 当前客户数量,用于索引数组
int customerNum = 0;

// 删除指定索引位置的客户
// 删除失败,返回0
// 删除成功,返回非0
int removeCustomer(int index)
{
    if (index < 0 || index >= customerNum)
    {
        return -1;
    }

    // 通过循环遍历的方式,将 index 后续位置依次前移,实现删除
    for (int i = index; i < customerNum - 1; i++)
    {
        customers[i] = customers[i + 1];
        // 如果需要修改编号
        customers[i].id = i + 1;
    }

    customerNum--;
    return 1;
}

// 判断指定编号的客户是否存在
// 如果客户不存在, 返回 -1
// 如果客户存在,返回此编号的客户所在数组中的索引位置
int getCustomerIndex(int id)
{
    for (int i = 0; i < customerNum; i++)
    {
        if (customers[i].id == id)
        {
            return i;
        }
    }
    // 如果没有找到
    return -1;
}

// 删除客户的功能
// 删除客户的功能
void deleteCustomer()
{
    puts("---------------------删除客户---------------------");
    puts("请选择待删除客户编号(-1退出):");

    int deleteId;
    if (scanf("%d", &deleteId) != 1) // 检查输入是否为整数
    {
        puts("无效的输入,请输入一个数字!");
        while (getchar() != '\n')
            ; // 清理输入缓冲区
        return;
    }

    if (deleteId == -1)
    {
        return;
    }

    // 判断给定的客户编号对应的客户是否存在
    int deleteIndex = getCustomerIndex(deleteId);

    if (deleteIndex == -1)
    {
        puts("不存在指定编号的客户!");
        return;
    }

    // 确认删除
    puts("确认是否删除(Y/N):");

    char isDelete;
    if (scanf(" %c", &isDelete) != 1) // 检查输入是否为字符
    {
        puts("无效的输入,请输入 Y 或 N!");
        while (getchar() != '\n')
            ; // 清理输入缓冲区
        return;
    }

    if (isDelete == 'N')
    {
        return;
    }
    else if (isDelete == 'Y')
    {
        // 具体删除过程
        if (removeCustomer(deleteIndex) != 0)
        {
            puts("---------------------删除成功---------------------");
        }
        else
        {
            puts("---------------------删除失败---------------------");
        }
    }
    else
    {
        puts("你输入的选择有误!");
    }
}

// 添加客户的功能
void addCustomer()
{
    if (customerNum < MAX_CAPACITY)
    {
        puts("---------------------添加客户---------------------");

        // struct Customer cus = customers[customerNum]; // 错误写法,相当于复制数组

        // 使用指针指向当前客户的地址,后续操作是操作的地址所指向的内容
        struct Customer *cusPtr = &customers[customerNum];

        // 编号自动累加的方式赋值
        // 注意这里不要使用 customerNum++,因为后续需要用它进行赋值
        cusPtr->id = customerNum + 1;

        // 输入客户姓名
        printf("姓名: ");
        char name[10];
        if (scanf("%9s", name) != 1) // 限制输入长度为 9,防止溢出
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        strcpy(cusPtr->name, name);

        // 输入客户性别
        printf("性别: ");
        char gender;
        if (scanf(" %c", &gender) != 1) // %c 前面有空格,用于跳过前面的空白字符
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        cusPtr->gender = gender;

        // 输入客户年龄
        printf("年龄: ");
        int age;
        if (scanf("%d", &age) != 1)
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        cusPtr->age = age;

        // 输入客户电话
        printf("电话: ");
        char phone[20];
        if (scanf("%19s", phone) != 1) // 限制输入长度为 19,防止溢出
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        strcpy(cusPtr->phone, phone);

        // 输入客户邮箱
        printf("邮箱: ");
        char email[40];
        if (scanf("%39s", email) != 1) // 限制输入长度为 39,防止溢出
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        strcpy(cusPtr->email, email);

        customerNum++; // 增加客户数量
        puts("---------------------添加完成---------------------");
    }
    else
    {
        puts("客户列表已满,添加失败");
    }
}

// 显示某个客户的信息
void showCustomer(struct Customer *custPtr)
{
    // 两种方式访问结构体指针成员
    // 第一种方式:(*custPtr).member
    // 第二种方式:custPtr->member
    printf("%d\t%s\t%c\t%d\t%s\t\t%s\n", (*custPtr).id, custPtr->name, custPtr->gender, custPtr->age, custPtr->phone, custPtr->email);
}

// 显示客户列表的功能
void showView()
{
    if (customerNum < 1)
    {
        puts("系统中没有任何客户的信息,请先添加!");
    }
    else
    {
        puts("-------------------客户列表-------------------");
        puts("\n编号\t姓名\t\t性别\t年龄\t电话\t\t邮箱");
        // 遍历数组
        for (int i = 0; i < customerNum; i++)
        {
            showCustomer(&customers[i]); // 调用 showCustomer 函数显示每个客户的信息
        }
    }
}

// 确认退出函数
void confirmExit()
{
    puts("确认是否退出(Y/N):");
    char isExit;
    // 读取用户输入的确认信息
    while (1)
    {
        if (scanf(" %c", &isExit) != 1) // %c 前面有空格,用于跳过前面的空白字符
        {
            puts("无效的输入,请输入 Y 或 N!"); // 提示错误信息
            // 清理输入缓冲区
            while (getchar() != '\n')
                ;
            continue; // 跳过本次循环
        }

        // 检查用户输入是否有效
        if (isExit == 'Y' || isExit == 'N')
        {
            break; // 结束循环
        }
        else
        {
            puts("你输入有误,请从新输入(Y/N):"); // 提示重新输入
        }
    }

    // 如果用户选择退出,设置循环标志为 0
    if (isExit == 'Y')
    {
        loop = 0;
        puts("欢迎你的再次访问^_^"); // 退出提示
    }
}

// 显示菜单并处理用户选择的函数
void menu()
{
    while (loop) // 主循环,持续显示菜单直到用户选择退出
    {
        // 显示菜单选项
        printf("\n\n\n--------------客户信息管理软件--------------");
        printf("\n               1 添 加 客 户");
        printf("\n               2 修 改 客 户");
        printf("\n               3 删 除 客 户");
        printf("\n               4 客 户 列 表");
        printf("\n               5 退       出");
        printf("\n请选择(1-5):");

        int selection; // 存储用户的选项
        // 使用 scanf 读取用户输入
        if (scanf("%d", &selection) != 1) // 如果输入不是整数
        {
            puts("无效的输入,请输入一个数字 (1-5)!"); // 提示错误信息
            // 清理输入缓冲区中的非数字字符
            while (getchar() != '\n')
                ;
            continue; // 跳过本次循环的剩余部分,重新开始循环
        }
        // 根据用户选择执行相应操作
        switch (selection)
        {
        case 1:
            addCustomer(); // 用户选择了添加客户
            break;
        case 2:
            puts("修 改 客 户"); // 用户选择了修改客户
            break;
        case 3:
            deleteCustomer(); // 用户选择了删除客户
            break;
        case 4:
            showView(); // 用户选择了查看客户列表
            break;
        case 5:
            confirmExit(); // 用户选择了退出程序
            break;
        default:
            puts("无效的选择,请重新选择!"); // 用户输入了不在 1-5 范围内的数字
            break;
        }
    }
}

int main()
{

    // 模拟数据的添加,便于测试客户显示列表功能
    customers[0].id = 1;

    // 在 C 语言中,直接使用 = 运算符给字符数组赋值是不允许的
    // 这是因为字符数组实际上是一个指针,指向一个字符序列的起始位置
    // = 运算符只能用于初始化指针,而不能用于复制字符串内容
    // customers[0].name = "mynameis666";  错误用法

    strcpy(customers[0].name, "Thanks_ks");
    customers[0].gender = 'm';
    customers[0].age = 18;
    strcpy(customers[0].phone, "1008611");
    strcpy(customers[0].email, "1008611@qq.com");
    customerNum++;

    // 模拟数据的添加,便于测试客户显示列表功能
    customers[1].id = 2;
    strcpy(customers[1].name, "THANKS_KS");
    customers[1].gender = 'f';
    customers[1].age = 22;
    strcpy(customers[1].phone, "1001010");
    strcpy(customers[1].email, "1009999@qq.com");
    customerNum++;

    menu(); // 调用菜单函数

    // 提示用户已退出软件
    puts("你退出了客户管理系统~");

    return 0; // 程序正常结束
}

3.7 修改客户功能

#include <stdio.h>
#include <string.h>

#define MAX_CAPACITY 100 // 客户数量的最大值

// 定义结构体数据类型来存储客户信息
struct Customer
{
    int id;         // 客户编号
    char name[10];  // 客户名字
    char gender;    // 性别,'f' 表示女,'m' 表示男
    int age;        // 年龄
    char phone[20]; // 电话号码
    char email[40]; // 邮箱地址
};

int loop = 1; // 全局变量控制主循环是否继续的变量

// 客户结构体数组,最多可以存储 100 个客户信息
struct Customer customers[MAX_CAPACITY];

// 当前客户数量,用于索引数组
int customerNum = 0;

// 删除指定索引位置的客户
// 删除失败,返回0
// 删除成功,返回非0
int removeCustomer(int index)
{
    if (index < 0 || index >= customerNum)
    {
        return -1;
    }

    // 通过循环遍历的方式,将 index 后续位置依次前移,实现删除
    for (int i = index; i < customerNum - 1; i++)
    {
        customers[i] = customers[i + 1];
        // 如果需要修改编号
        customers[i].id = i + 1;
    }

    customerNum--;
    return 1;
}

// 判断指定编号的客户是否存在
// 如果客户不存在, 返回 -1
// 如果客户存在,返回此编号的客户所在数组中的索引位置
int getCustomerIndex(int id)
{
    for (int i = 0; i < customerNum; i++)
    {
        if (customers[i].id == id)
        {
            return i;
        }
    }
    // 如果没有找到
    return -1;
}

// 删除客户的功能
// 删除客户的功能
void deleteCustomer()
{
    puts("---------------------删除客户---------------------");
    puts("请选择待删除客户编号(-1退出):");

    int deleteId;
    if (scanf("%d", &deleteId) != 1) // 检查输入是否为整数
    {
        puts("无效的输入,请输入一个数字!");
        while (getchar() != '\n')
            ; // 清理输入缓冲区
        return;
    }

    if (deleteId == -1)
    {
        return;
    }

    // 判断给定的客户编号对应的客户是否存在
    int deleteIndex = getCustomerIndex(deleteId);

    if (deleteIndex == -1)
    {
        puts("不存在指定编号的客户!");
        return;
    }

    // 确认删除
    puts("确认是否删除(Y/N):");

    char isDelete;
    if (scanf(" %c", &isDelete) != 1) // 检查输入是否为字符
    {
        puts("无效的输入,请输入 Y 或 N!");
        while (getchar() != '\n')
            ; // 清理输入缓冲区
        return;
    }

    if (isDelete == 'N')
    {
        return;
    }
    else if (isDelete == 'Y')
    {
        // 具体删除过程
        if (removeCustomer(deleteIndex) != 0)
        {
            puts("---------------------删除成功---------------------");
        }
        else
        {
            puts("---------------------删除失败---------------------");
        }
    }
    else
    {
        puts("你输入的选择有误!");
    }
}

// 添加客户的功能
void addCustomer()
{
    if (customerNum < MAX_CAPACITY)
    {
        puts("---------------------添加客户---------------------");

        // struct Customer cus = customers[customerNum]; // 错误写法,相当于复制数组

        // 使用指针指向当前客户的地址,后续操作是操作的地址所指向的内容
        struct Customer *cusPtr = &customers[customerNum];

        // 编号自动累加的方式赋值
        // 注意这里不要使用 customerNum++,因为后续需要用它进行赋值
        cusPtr->id = customerNum + 1;

        // 输入客户姓名
        printf("姓名: ");
        char name[10];
        if (scanf("%9s", name) != 1) // 限制输入长度为 9,防止溢出
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        strcpy(cusPtr->name, name);

        // 输入客户性别
        printf("性别: ");
        char gender;
        if (scanf(" %c", &gender) != 1) // %c 前面有空格,用于跳过前面的空白字符
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        cusPtr->gender = gender;

        // 输入客户年龄
        printf("年龄: ");
        int age;
        if (scanf("%d", &age) != 1)
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        cusPtr->age = age;

        // 输入客户电话
        printf("电话: ");
        char phone[20];
        if (scanf("%19s", phone) != 1) // 限制输入长度为 19,防止溢出
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        strcpy(cusPtr->phone, phone);

        // 输入客户邮箱
        printf("邮箱: ");
        char email[40];
        if (scanf("%39s", email) != 1) // 限制输入长度为 39,防止溢出
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        strcpy(cusPtr->email, email);

        customerNum++; // 增加客户数量
        puts("---------------------添加完成---------------------");
    }
    else
    {
        puts("客户列表已满,添加失败");
    }
}

// 显示某个客户的信息
void showCustomer(struct Customer *custPtr)
{
    // 两种方式访问结构体指针成员
    // 第一种方式:(*custPtr).member
    // 第二种方式:custPtr->member
    printf("%d\t%s\t%c\t%d\t%s\t\t%s\n", (*custPtr).id, custPtr->name, custPtr->gender, custPtr->age, custPtr->phone, custPtr->email);
}

// 显示客户列表的功能
void showView()
{
    if (customerNum < 1)
    {
        puts("系统中没有任何客户的信息,请先添加!");
    }
    else
    {
        puts("-------------------客户列表-------------------");
        puts("\n编号\t姓名\t\t性别\t年龄\t电话\t\t邮箱");
        // 遍历数组
        for (int i = 0; i < customerNum; i++)
        {
            showCustomer(&customers[i]); // 调用 showCustomer 函数显示每个客户的信息
        }
    }
}

// 修改客户的功能
void modifyCustomer()
{
    puts("---------------------修改客户---------------------");
    puts("请选择待修改客户编号(-1退出):");

    int modifyId;
    if (scanf("%d", &modifyId) != 1) // 检查输入是否为整数
    {
        puts("无效的输入,请输入一个数字!");
        while (getchar() != '\n')
            ; // 清理输入缓冲区
        return;
    }

    if (modifyId == -1)
    {
        return;
    }
    // 判断给定的客户编号对应的客户是否存在
    int modifyIndex = getCustomerIndex(modifyId);

    if (modifyIndex == -1)
    {
        puts("不存在指定编号的客户!");
        return;
    }

    struct Customer *cusPtr = &customers[modifyIndex];
    puts("---------------------修改客户---------------------");
    // 声明一个通用的字符串,用于存储可能要修改的数据
    char info[30];
    getchar();

    // 展示初始信息
    printf("姓名(%s):", cusPtr->name);
    fgets(info, sizeof(info), stdin);
    // 如果读取到的是换行,说明不想改数据,反之就是要修改数据
    if (!(info[0] == '\n'))
    {
        // strcpy(cusPtr->name, info);
        sscanf(info, "%s", cusPtr->name);
    }

    printf("性别( %c):", cusPtr->gender);
    // scanf("%s", info);
    fgets(info, sizeof(info), stdin);
    // 如果读取到的是换行,说明不想改数据,反之就是要修改数据
    if (!(info[0] == '\n'))
    {
        // cusPtr->gender = info[0];
        sscanf(info, "%c", &cusPtr->gender);
    }

    printf("年龄(%d):", cusPtr->age);
    fgets(info, sizeof(info), stdin);
    // 如果读取到的是换行,说明不想改数据,反之就是要修改数据
    if (!(info[0] == '\n'))
    {
        // cusPtr->age = info[0];
        sscanf(info, "%d", &cusPtr->age);
    }

    printf("电话(%s):", cusPtr->phone);
    fgets(info, sizeof(info), stdin);
    // 如果读取到的是换行,说明不想改数据,反之就是要修改数据
    if (!(info[0] == '\n'))
    {
        // strcpy(cusPtr->phone, info);
        sscanf(info, "%s", cusPtr->phone);
    }

    printf("邮箱(%s):", cusPtr->email);
    fgets(info, sizeof(info), stdin);
    // 如果读取到的是换行,说明不想改数据,反之就是要修改数据
    if (!(info[0] == '\n'))
    {
        // strcpy(cusPtr->email, info);
        sscanf(info, "%s", cusPtr->email);
    }
    puts("---------------------修改完成---------------------");
}

// 确认退出函数
void confirmExit()
{
    puts("确认是否退出(Y/N):");
    char isExit;
    // 读取用户输入的确认信息
    while (1)
    {
        if (scanf(" %c", &isExit) != 1) // %c 前面有空格,用于跳过前面的空白字符
        {
            puts("无效的输入,请输入 Y 或 N!"); // 提示错误信息
            // 清理输入缓冲区
            while (getchar() != '\n')
                ;
            continue; // 跳过本次循环
        }

        // 检查用户输入是否有效
        if (isExit == 'Y' || isExit == 'N')
        {
            break; // 结束循环
        }
        else
        {
            puts("你输入有误,请从新输入(Y/N):"); // 提示重新输入
        }
    }

    // 如果用户选择退出,设置循环标志为 0
    if (isExit == 'Y')
    {
        loop = 0;
        puts("欢迎你的再次访问^_^"); // 退出提示
    }
}

// 显示菜单并处理用户选择的函数
void menu()
{
    while (loop) // 主循环,持续显示菜单直到用户选择退出
    {
        // 显示菜单选项
        printf("\n\n\n--------------客户信息管理软件--------------");
        printf("\n               1 添 加 客 户");
        printf("\n               2 修 改 客 户");
        printf("\n               3 删 除 客 户");
        printf("\n               4 客 户 列 表");
        printf("\n               5 退       出");
        printf("\n请选择(1-5):");

        int selection; // 存储用户的选项
        // 使用 scanf 读取用户输入
        if (scanf("%d", &selection) != 1) // 如果输入不是整数
        {
            puts("无效的输入,请输入一个数字 (1-5)!"); // 提示错误信息
            // 清理输入缓冲区中的非数字字符
            while (getchar() != '\n')
                ;
            continue; // 跳过本次循环的剩余部分,重新开始循环
        }
        // 根据用户选择执行相应操作
        switch (selection)
        {
        case 1:
            addCustomer(); // 用户选择了添加客户
            break;
        case 2:
            modifyCustomer(); // 用户选择了修改客户
            break;
        case 3:
            deleteCustomer(); // 用户选择了删除客户
            break;
        case 4:
            showView(); // 用户选择了查看客户列表
            break;
        case 5:
            confirmExit(); // 用户选择了退出程序
            break;
        default:
            puts("无效的选择,请重新选择!"); // 用户输入了不在 1-5 范围内的数字
            break;
        }
    }
}

int main()
{

    // 模拟数据的添加,便于测试客户显示列表功能
    customers[0].id = 1;

    // 在 C 语言中,直接使用 = 运算符给字符数组赋值是不允许的
    // 这是因为字符数组实际上是一个指针,指向一个字符序列的起始位置
    // = 运算符只能用于初始化指针,而不能用于复制字符串内容
    // customers[0].name = "mynameis666";  错误用法
    strcpy(customers[0].name, "Thanks_ks");
    customers[0].gender = 'm';
    customers[0].age = 18;
    strcpy(customers[0].phone, "1008611");
    strcpy(customers[0].email, "1008611@qq.com");
    customerNum++;

    // 模拟数据的添加,便于测试客户显示列表功能
    customers[1].id = 2;
    strcpy(customers[1].name, "THANKS_KS");
    customers[1].gender = 'f';
    customers[1].age = 22;
    strcpy(customers[1].phone, "1001010");
    strcpy(customers[1].email, "1009999@qq.com");
    customerNum++;

    menu(); // 调用菜单函数

    // 提示用户已退出软件
    puts("你退出了客户管理系统~");

    return 0; // 程序正常结束
}

4 最终优化后的代码

#include <stdio.h>
#include <string.h>

#define MAX_CAPACITY 100 // 客户数量的最大值

// 定义结构体数据类型来存储客户信息
struct Customer
{
    int id;         // 客户编号
    char name[10];  // 客户名字
    char gender;    // 性别,'f' 表示女,'m' 表示男
    int age;        // 年龄
    char phone[20]; // 电话号码
    char email[40]; // 邮箱地址
};

int loop = 1; // 全局变量控制主循环是否继续的变量

// 客户结构体数组,最多可以存储 100 个客户信息
struct Customer customers[MAX_CAPACITY];

// 当前客户数量,用于索引数组
int customerNum = 0;

// 函数原型声明
int removeCustomer(int index);
int getCustomerIndex(int id);
void deleteCustomer();
void addCustomer();
void showCustomer(struct Customer *custPtr);
void showView();
void modifyCustomer();
void confirmExit();
void menu();

// 主函数
int main()
{
    // 模拟数据的添加,便于测试客户显示列表功能
    customers[0].id = 1;
    strcpy(customers[0].name, "Thanks_ks");
    customers[0].gender = 'm';
    customers[0].age = 18;
    strcpy(customers[0].phone, "1008611");
    strcpy(customers[0].email, "1008611@qq.com");
    customerNum++;

    customers[1].id = 2;
    strcpy(customers[1].name, "THANKS_KS");
    customers[1].gender = 'f';
    customers[1].age = 22;
    strcpy(customers[1].phone, "1001010");
    strcpy(customers[1].email, "1009999@qq.com");
    customerNum++;

    menu(); // 调用菜单函数

    // 提示用户已退出软件
    puts("你退出了客户管理系统~");

    return 0; // 程序正常结束
}

// 删除指定索引位置的客户
// 删除失败,返回0
// 删除成功,返回非0
int removeCustomer(int index)
{
    if (index < 0 || index >= customerNum)
    {
        return -1;
    }

    // 通过循环遍历的方式,将 index 后续位置依次前移,实现删除
    for (int i = index; i < customerNum - 1; i++)
    {
        customers[i] = customers[i + 1];
        // 如果需要修改编号
        customers[i].id = i + 1;
    }

    customerNum--;
    return 1;
}

// 判断指定编号的客户是否存在
// 如果客户不存在, 返回 -1
// 如果客户存在,返回此编号的客户所在数组中的索引位置
int getCustomerIndex(int id)
{
    for (int i = 0; i < customerNum; i++)
    {
        if (customers[i].id == id)
        {
            return i;
        }
    }
    // 如果没有找到
    return -1;
}

// 删除客户的功能
void deleteCustomer()
{
    puts("---------------------删除客户---------------------");
    puts("请选择待删除客户编号(-1退出):");

    int deleteId;
    if (scanf("%d", &deleteId) != 1) // 检查输入是否为整数
    {
        puts("无效的输入,请输入一个数字!");
        while (getchar() != '\n')
            ; // 清理输入缓冲区
        return;
    }

    if (deleteId == -1)
    {
        return;
    }

    // 判断给定的客户编号对应的客户是否存在
    int deleteIndex = getCustomerIndex(deleteId);

    if (deleteIndex == -1)
    {
        puts("不存在指定编号的客户!");
        return;
    }

    // 确认删除
    puts("确认是否删除(Y/N):");

    char isDelete;
    if (scanf(" %c", &isDelete) != 1) // 检查输入是否为字符
    {
        puts("无效的输入,请输入 Y 或 N!");
        while (getchar() != '\n')
            ; // 清理输入缓冲区
        return;
    }

    if (isDelete == 'N')
    {
        return;
    }
    else if (isDelete == 'Y')
    {
        // 具体删除过程
        if (removeCustomer(deleteIndex) != 0)
        {
            puts("---------------------删除成功---------------------");
        }
        else
        {
            puts("---------------------删除失败---------------------");
        }
    }
    else
    {
        puts("你输入的选择有误!");
    }
}

// 添加客户的功能
void addCustomer()
{
    if (customerNum < MAX_CAPACITY)
    {
        puts("---------------------添加客户---------------------");

        // 使用指针指向当前客户的地址,后续操作是操作的地址所指向的内容
        struct Customer *cusPtr = &customers[customerNum];

        // 编号自动累加的方式赋值
        // 注意这里不要使用 customerNum++,因为后续需要用它进行赋值
        cusPtr->id = customerNum + 1;

        // 输入客户姓名
        printf("姓名: ");
        char name[10];
        if (scanf("%9s", name) != 1) // 限制输入长度为 9,防止溢出
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        strcpy(cusPtr->name, name);

        // 输入客户性别
        printf("性别: ");
        char gender;
        if (scanf(" %c", &gender) != 1) // %c 前面有空格,用于跳过前面的空白字符
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        cusPtr->gender = gender;

        // 输入客户年龄
        printf("年龄: ");
        int age;
        if (scanf("%d", &age) != 1)
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        cusPtr->age = age;

        // 输入客户电话
        printf("电话: ");
        char phone[20];
        if (scanf("%19s", phone) != 1) // 限制输入长度为 19,防止溢出
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        strcpy(cusPtr->phone, phone);

        // 输入客户邮箱
        printf("邮箱: ");
        char email[40];
        if (scanf("%39s", email) != 1) // 限制输入长度为 39,防止溢出
        {
            puts("无效的输入,请重新输入!");
            while (getchar() != '\n')
                ; // 清理输入缓冲区
            return;
        }
        strcpy(cusPtr->email, email);

        customerNum++; // 增加客户数量
        puts("---------------------添加完成---------------------");
    }
    else
    {
        puts("客户列表已满,添加失败");
    }
}

// 显示某个客户的信息
void showCustomer(struct Customer *custPtr)
{
    // 两种方式访问结构体指针成员
    // 第一种方式:(*custPtr).member
    // 第二种方式:custPtr->member
    printf("%d\t%s\t%c\t%d\t%s\t\t%s\n", (*custPtr).id, custPtr->name, custPtr->gender, custPtr->age, custPtr->phone, custPtr->email);
}

// 显示客户列表的功能
void showView()
{
    if (customerNum < 1)
    {
        puts("系统中没有任何客户的信息,请先添加!");
    }
    else
    {
        puts("-------------------客户列表-------------------");
        puts("\n编号\t姓名\t\t性别\t年龄\t电话\t\t邮箱");
        // 遍历数组
        for (int i = 0; i < customerNum; i++)
        {
            showCustomer(&customers[i]); // 调用 showCustomer 函数显示每个客户的信息
        }
    }
}

// 修改客户的功能
void modifyCustomer()
{
    puts("---------------------修改客户---------------------");
    puts("请选择待修改客户编号(-1退出):");

    int modifyId;
    if (scanf("%d", &modifyId) != 1) // 检查输入是否为整数
    {
        puts("无效的输入,请输入一个数字!");
        while (getchar() != '\n')
            ; // 清理输入缓冲区
        return;
    }

    if (modifyId == -1)
    {
        return;
    }
    // 判断给定的客户编号对应的客户是否存在
    int modifyIndex = getCustomerIndex(modifyId);

    if (modifyIndex == -1)
    {
        puts("不存在指定编号的客户!");
        return;
    }

    struct Customer *cusPtr = &customers[modifyIndex];
    puts("---------------------修改客户---------------------");
    // 声明一个通用的字符串,用于存储可能要修改的数据
    char info[30];
    getchar();

    // 展示初始信息
    printf("姓名(%s):", cusPtr->name);
    fgets(info, sizeof(info), stdin);
    // 如果读取到的是换行,说明不想改数据,反之就是要修改数据
    if (!(info[0] == '\n'))
    {
        sscanf(info, "%s", cusPtr->name);
    }

    printf("性别( %c):", cusPtr->gender);
    fgets(info, sizeof(info), stdin);
    // 如果读取到的是换行,说明不想改数据,反之就是要修改数据
    if (!(info[0] == '\n'))
    {
        sscanf(info, "%c", &cusPtr->gender);
    }

    printf("年龄(%d):", cusPtr->age);
    fgets(info, sizeof(info), stdin);
    // 如果读取到的是换行,说明不想改数据,反之就是要修改数据
    if (!(info[0] == '\n'))
    {
        sscanf(info, "%d", &cusPtr->age);
    }

    printf("电话(%s):", cusPtr->phone);
    fgets(info, sizeof(info), stdin);
    // 如果读取到的是换行,说明不想改数据,反之就是要修改数据
    if (!(info[0] == '\n'))
    {
        sscanf(info, "%s", cusPtr->phone);
    }

    printf("邮箱(%s):", cusPtr->email);
    fgets(info, sizeof(info), stdin);
    // 如果读取到的是换行,说明不想改数据,反之就是要修改数据
    if (!(info[0] == '\n'))
    {
        sscanf(info, "%s", cusPtr->email);
    }
    puts("---------------------修改完成---------------------");
}

// 确认退出函数
void confirmExit()
{
    puts("确认是否退出(Y/N):");
    char isExit;
    // 读取用户输入的确认信息
    while (1)
    {
        if (scanf(" %c", &isExit) != 1) // %c 前面有空格,用于跳过前面的空白字符
        {
            puts("无效的输入,请输入 Y 或 N!"); // 提示错误信息
            // 清理输入缓冲区
            while (getchar() != '\n')
                ;
            continue; // 跳过本次循环
        }

        // 检查用户输入是否有效
        if (isExit == 'Y' || isExit == 'N')
        {
            break; // 结束循环
        }
        else
        {
            puts("你输入有误,请从新输入(Y/N):"); // 提示重新输入
        }
    }

    // 如果用户选择退出,设置循环标志为 0
    if (isExit == 'Y')
    {
        loop = 0;
        puts("欢迎你的再次访问^_^"); // 退出提示
    }
}

// 显示菜单并处理用户选择的函数
void menu()
{
    while (loop) // 主循环,持续显示菜单直到用户选择退出
    {
        // 显示菜单选项
        printf("\n\n\n--------------客户信息管理软件--------------");
        printf("\n               1 添 加 客 户");
        printf("\n               2 修 改 客 户");
        printf("\n               3 删 除 客 户");
        printf("\n               4 客 户 列 表");
        printf("\n               5 退       出");
        printf("\n请选择(1-5):");

        int selection; // 存储用户的选项
        // 使用 scanf 读取用户输入
        if (scanf("%d", &selection) != 1) // 如果输入不是整数
        {
            puts("无效的输入,请输入一个数字 (1-5)!"); // 提示错误信息
            // 清理输入缓冲区中的非数字字符
            while (getchar() != '\n')
                ;
            continue; // 跳过本次循环的剩余部分,重新开始循环
        }
        // 根据用户选择执行相应操作
        switch (selection)
        {
        case 1:
            addCustomer(); // 用户选择了添加客户
            break;
        case 2:
            modifyCustomer(); // 用户选择了修改客户
            break;
        case 3:
            deleteCustomer(); // 用户选择了删除客户
            break;
        case 4:
            showView(); // 用户选择了查看客户列表
            break;
        case 5:
            confirmExit(); // 用户选择了退出程序
            break;
        default:
            puts("无效的选择,请重新选择!"); // 用户输入了不在 1-5 范围内的数字
            break;
        }
    }
}

 


原文地址:https://blog.csdn.net/qq_53139964/article/details/142863367

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!