首页 > 解决方案 > 为什么我的 Struct 成员在不应该发生变化时发生变化?

问题描述

我用 C 语言编写了这段代码,如果使用 increaseBalance 函数找到具有匹配字符串 ID 的帐户余额,我想增加它的余额,虽然它确实增加了余额值,但它也改变了结构 ID 的值也是。这是我的代码

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

#define MAX_ACCOUNT_NUM 1000
#define NAME_LEN 15
#define ACCOUNT_NUM_LEN 6
#define FILE_LEN 20

struct bank_account
{
    char owner_first_name[NAME_LEN], owner_last_name[NAME_LEN], account_num[ACCOUNT_NUM_LEN];
    int balance;

};
typedef struct bank_account Account;


void reg_new_acc(Account account_reg[], int *nrOfAccounts);
Account create_user(char owner_first_name[], char owner_last_name[], char account_num[]);
void accountManagement(Account account_reg[],int *nrOfAccounts);
void print_account(Account account_reg[], int *pNrOfAccounts);
int checkAccountNum(Account account_reg[],char account_num[], int *nrOfAccounts);

void increaseBalance(Account account_reg[], char accountNum[], int  amount, int *nrOfAccounts);

int main(void)
{
    Account account_reg[MAX_ACCOUNT_NUM];
    int nrOfAccounts = 0;
    char accountFile[FILE_LEN];
    //readFromFile(account_reg, &nrOfAccounts, accountFile);
    accountManagement(account_reg, &nrOfAccounts);


    return 0;
}

void accountManagement(Account account_reg[],int *nrOfAccounts)
{
    int choice = 0;

    do
    {
        printf("(1) Create New Account \n(2) Print All Accounts\n(3) Increment Account Balance\n");
        printf("\n\nEnter Number: ");
        scanf("%d", &choice);

        switch (choice)
        {
            case 1:

                reg_new_acc(account_reg, nrOfAccounts);
                break;

            case 2:
                print_account(account_reg, nrOfAccounts);
                break;
            case 3:
                    printf("Please Enter the Account Number: ");
                char accountNumber21[ACCOUNT_NUM_LEN];
                scanf("%126s", accountNumber21);

                printf("Please Enter the Amount: ");
                int amount=0;
                scanf("%d", &amount);
                increaseBalance(account_reg, accountNumber21,amount, nrOfAccounts);
                break;

           

        }

    } while ( choice != 9);
}


void reg_new_acc(Account account_reg[], int *nrOfAccounts)
{

    char owner_first_name[NAME_LEN], owner_last_name[NAME_LEN], account_num[ACCOUNT_NUM_LEN];

    while (*nrOfAccounts < MAX_ACCOUNT_NUM)
    {

        printf("\nRegistering User\n");
        printf("Please enter (6-dig) ID number (q for quiting): ");
        scanf("%s%*c", account_num);

        if (strcmp(account_num, "q") == 0)
        {
            printf("Avslutar\n");
            return ;
        }

        while(checkAccountNum(account_reg, account_num, nrOfAccounts)==0)
        {

            printf("This Already Exists\n");
            printf("Please Enter Again: ");
            scanf("%s%*c", account_num);

        }



        printf("Enter Name and Lastname: ");
        scanf(" %s",owner_first_name);
        scanf(" %s", owner_last_name);

        account_reg[*nrOfAccounts] = create_user(owner_first_name, owner_last_name, account_num);
        (*nrOfAccounts)++;



    }

}

int checkAccountNum(Account account_reg[],char account_num[], int *nrOfAccounts)
{

    if(strcmp(account_num, "q") == 0)
    {

        accountManagement(account_reg , nrOfAccounts);

    }

    for(int i = 0; i < *nrOfAccounts; i++)
    {
        if(strcmp(account_num,account_reg[i].account_num) == 0)
        {
            return 0;
        }
    }

    return 1;
}

Account create_user(char owner_first_name[], char owner_last_name[], char account_num[])
{

    Account account;
    strcpy(account.account_num, account_num);
    strcpy(account.owner_first_name, owner_first_name);
    strcpy(account.owner_last_name, owner_last_name);
    account.balance=0;
    return account;
}

void print_account(Account account_reg[], int *pNrOfAccounts)
{
    int i;
    printf("\nPrinting All Accounts\n");
    printf("ID\tFull Name\t\tBalance (kr)\n");
    printf("____________________________________________\n");
    for(i = 0; i < *pNrOfAccounts; i++)
    {
        printf("%s\t\t%s\t%s\t\t%d\n\n", account_reg[i].account_num, account_reg[i].owner_first_name, account_reg[i].owner_last_name, account_reg[i].balance);
    }
}


void increaseBalance(Account account_reg[], char accountNum[], int  amount, int *nrOfAccounts)
{

    for(int i = 0; i < *nrOfAccounts; i++)
    {
       if(strcmp(accountNum,account_reg[i].account_num) == 0)
        {
            printf("In Increase");
            account_reg[i].balance+=amount;
        }
    }

}

如果您运行此代码并在添加用户后尝试增加用户帐户余额,然后打印出用户详细信息,您会看到用户 ID 号发生了一些奇怪的事情。我不知道为什么会这样。谢谢你的时间。

标签: c

解决方案


从代码中,将 ACCOUNT_NUM_LEN 的值更改为 7 以处理空终止符。这应该可以解决您的问题。

请记住,c 字符串是空终止的。空终止符也占用了一些空间,应该加以考虑。


推荐阅读