编辑代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//创建结构体
typedef struct account
{
    int accountnumber;
    char name[50];
    float balance;
    struct account* next;
}account;
//创建链节
account* createnode(int accountnumber, const char* name, float balance) {
    account* newnode = (account*)malloc(sizeof(account));
    if (newnode == NULL)
    {
        printf(" 创建账户失败\n");
        return NULL;
    }
    newnode->accountnumber = accountnumber;
    newnode->balance = balance;
    newnode->next = NULL;
    strcpy(newnode->name, name);
    return newnode;
}

// 优化后的输入函数,处理无效输入和空格
void safe_scanf_int(int* num) {
    int success = 0;
    while (!success) {
        printf("请输入一个整数: ");
        success = scanf("%d", num);
        while (getchar() != '\n');  // 清空输入缓冲区
        if (!success) {
            printf("输入无效,请重新输入\n");
        }
    }
}

// 处理浮点数输入,包括无效输入
void safe_scanf_float(float* num) {
    int success = 0;
    while (!success) {
        printf("请输入一个浮点数: ");
        success = scanf("%f", num);
        while (getchar() != '\n');  // 清空输入缓冲区
        if (!success) {
            printf("输入无效,请重新输入\n");
        }
    }
}

// 处理字符串输入,去除末尾的换行符
void safe_scanf_string(char* str, size_t size) {
    printf("请输入字符串: ");
    if (fgets(str, size, stdin)) {
        str[strcspn(str, "\n")] = '\0';  // 去除换行符
    }
}
//存款函数
void traverserlist(int accountnumber, float amount, account* first)
{
    account* current = first;
    while (current->next != NULL)
    {
        if (current->accountnumber == accountnumber) {
            current->balance += amount;
            printf("账号 %d 的余额现在是 %.2f\n", accountnumber, current->balance);
            return;
        }
        current = current->next;
    }
    printf("未找到账户号为%d的账户\n", accountnumber);
}
//取款函数
void withdraw(account* first, int accountnumber, float amount) {
    account* current = first;
    while (current != NULL) {
        if (current->accountnumber == accountnumber) {
            if (current->balance >= amount) {
                current->balance -= amount;
                printf("账号 %d 的余额现在是 %.2f\n", accountnumber, current->balance);
            }
            else {
                printf("余额不足,无法取款\n");
            }
            return;
        }
        current = current->next;
    }
    printf("未找到账号为 %d 的账户\n", accountnumber);
}
//查询账户
void checkBalance(account* first, int accountnumber) {
    account* current = first;
    while (current != NULL) {
        if (current->accountnumber == accountnumber) {
            printf("账号 %d 的余额是 %.2f\n", accountnumber, current->balance);
            return;
        }
        current = current->next;
    }
    printf("未找到账号为 %d 的账户\n", accountnumber);
}
//查询所有账户
void listAllAccounts(account* first) {
    account* current = first;
    while (current != NULL) {
        printf("账号 %d, 姓名 %s, 余额 %.2f\n", current->accountnumber, current->name, current->balance);
        current = current->next;
    }
}
//释放函数
void free_a(account* first)
{
    account* current = first;
    account* next;
    while (current != NULL) {
        next = current->next;
        free(current);
        current = next;
    }
}

int main() {
    account* first = NULL;
    float amount;
    char name[50];
    int accountnumber;
//由于字符串处理函数要求太高,所以用学过的函数进行模仿,将信息储存在数字中,并且通过if函数和函数调用来执行命令
    printf("输入0来创建账户\n输入1来存款到指定账户\n输入2来从指定账户取款\n输入3来查询指定账户的余额\n输入4来列出所有账户的信息\n输入5来终止操作");

    while (1) {
        int command = 9;
        safe_scanf_int(&command);

        if (command == 0) {
            accountnumber++;
            safe_scanf_string(name, sizeof(name));
            safe_scanf_float(&amount);
            account* newnode = createnode(accountnumber, name, amount);
            if (first == NULL) {
                first = newnode;
            }
            else {
                account* current = first;
                while (current->next != NULL) {
                    current = current->next;
                }
                current->next = newnode;
            }
            printf("创建账户%d成功,请进行下一步操作\n", accountnumber);
            continue;
        }
        if (command == 1) {
            safe_scanf_int(&accountnumber);
            safe_scanf_float(&amount);
            traverserlist(accountnumber, amount, first);
            continue;
        }
        if (command == 2) {
            safe_scanf_int(&accountnumber);
            safe_scanf_float(&amount);
            withdraw(first, accountnumber, amount);
            continue;
        }
        if (command == 3) {
            safe_scanf_int(&accountnumber);
            checkBalance(first, accountnumber);
            continue;
        }
        if (command == 4) {
            listAllAccounts(first);
            continue;
        }
        if (command == 5) {
            break;
        }
    }
    free_a(first);
    return 0;
}