问题
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