Why do i get the same string value but different arithmetic values when printing from a Doubly Linked List

大憨熊 提交于 2021-02-15 07:33:54

问题


So when printing from a DLL I get for all my records the same string values for the following fields: Last Name, First Name, Address, Place of Residence. All these fields hold string values. Although for each node I print I get the correct arithmetic values such as Customer ID, Address Number, Postal Code and Expenditure. This is my main:

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

#include "ClientList.h"

#define SIZE_T 5000
#define YES 1
#define NO 0

main(int argc, char *argv[]){
    FILE    *fp=NULL;
    unsigned long customerid;
    char    clname[SIZE_T];
    char    cfname[SIZE_T];
    char    Address[SIZE_T];
    unsigned int AddressNumber;
    char PlaceOfResidence[SIZE_T];
    unsigned int PostalCode;
    float Expenditure;

     ClientList *List = ClientList_create();

    fp=fopen(argv[1],"r");

    while(fscanf(fp,"%lu %s %s %s %d %s %u %f \n", &customerid, clname, cfname, Address, &AddressNumber, PlaceOfResidence, &PostalCode, &Expenditure) != EOF){
        //printf("+++ Just read: %lu %s %s %s %d %s %u %.02f \n",customerid, clname, cfname, Address, AddressNumber, PlaceOfResidence, PostalCode, Expenditure);
        ClientNode *Node = ClientNode_create(customerid, clname, cfname, Address, AddressNumber, PlaceOfResidence, PostalCode, Expenditure);
        ClientList_printNode(Node);
        ClientList_pushfront(List, Node);
}
    int K = size(List);
    unsigned long custid;
    char *name;
    printf("The size of the list is %d records \n",K);
    printf("Enter Customer ID you wish to search:\n");
    scanf("%lu",&custid);
    int M = ClientList_search(List, custid);
    if(M == YES)
        printf("YES\n");
    else
        printf("NO\n");
    Print_List(List);
    ClientList_destroy(List);
    fclose(fp);

    exit(0);
}

Also here are my insert and print_list functions:

void ClientList_pushfront(ClientList *list, ClientNode *node){
    node->next = list->head;
    node->previous = NULL;
    if(list->head != NULL){
        node->next = list->head;
        list->head->previous = node;
    }
    else{
        list->tail = node;
    }
    list->head = node;
    list->size ++;
}

void Print_List(ClientList *list)
{
    ClientNode *current = malloc(sizeof(ClientNode));
    current = list->head;
    while(current)
    {
        printf("Customer ID: %lu | Last Name: %s | First Name: %s | Address: %s | Number: %u | Place of Residence: %s | Postal Code: %d | Expenditure: %.02f |\n", current->customerid, current->LastName, current->FirstName, current->Address, current->AddressNumber, current->PlaceOfResidence, current->PostalCode, current->Expenditure);
        current = current->next;
    }   
}

My Create_Node function:

ClientNode *ClientNode_create(unsigned long customerid, char *LastName, char *FirstName, char *Address, unsigned int AddressNumber, char *PlaceOfResidence, unsigned int PostalCode, float Expenditure){
    ClientNode *client = malloc(sizeof(ClientNode));
    client->Expenditure = Expenditure;
    client->customerid = customerid;
    client->FirstName = FirstName;
    client->LastName = LastName;
    client->Address = Address;
    client->AddressNumber = AddressNumber;
    client->PostalCode = PostalCode;
    client->PlaceOfResidence = PlaceOfResidence;
    client->next = NULL;
    client->previous = NULL;
    return client;
}

And this is a part of the output i get:

Customer ID: 14260622 | Last Name: Pickett | First Name: Norma | Address: Todd | Number: 333 | Place of Residence: Robinwood | Postal Code: 23209 | Expenditure: 1030.00 |
Customer ID: 18723325 | Last Name: Pickett | First Name: Norma | Address: Todd | Number: 264 | Place of Residence: Robinwood | Postal Code: 42473 | Expenditure: 924.00 |
Customer ID: 16243937 | Last Name: Pickett | First Name: Norma | Address: Todd | Number: 350 | Place of Residence: Robinwood | Postal Code: 34297 | Expenditure: 402.00 |
Customer ID: 16451445 | Last Name: Pickett | First Name: Norma | Address: Todd | Number: 253 | Place of Residence: Robinwood | Postal Code: 14361 | Expenditure: 449.00 |

回答1:


In your ClientNode_create function, you copy the char pointers, not the values in the char pointers. This means the text fields in all structs will all point to the same char buffers in main.

One solution is to use malloc and strcpy.

client->FirstName = malloc(strlen(FirstName)+1);
strcpy(client->FirstName, FirstName));

for all strings. Or write a function that does this - many libraries also contain a function strdup that does exactly this.
And don't forget to free the memory later!



来源:https://stackoverflow.com/questions/33319996/why-do-i-get-the-same-string-value-but-different-arithmetic-values-when-printing

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!