Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
800 views
in Technique[技术] by (71.8m points)

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

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 
", &customerid, clname, cfname, Address, &AddressNumber, PlaceOfResidence, &PostalCode, &Expenditure) != EOF){
        //printf("+++ Just read: %lu %s %s %s %d %s %u %.02f 
",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 
",K);
    printf("Enter Customer ID you wish to search:
");
    scanf("%lu",&custid);
    int M = ClientList_search(List, custid);
    if(M == YES)
        printf("YES
");
    else
        printf("NO
");
    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 |
", 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 |
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...