I have a program that basically adds a history(node) to the employee_record(linked list).
Here is my code:
#include <stdio.h>
#include <stdlib.h>
struct history{
char *department1;
char *title1;
int day;
int month;
int year;
struct history *next;
};
struct employee_record{
char firstname[20];
char lastname[20];
long int employee_id;
char sex;
int age;
struct history *head;
};
void addjob(struct employee_record *rec,
char *department, char *title,
int day, int month, int year);
void print(struct employee_record *rec);
int main(int argc, char *argv[])
{
struct employee_record *worker=(struct employee_record*)malloc(sizeof(struct employee_record));
worker->head=NULL;
int c,d,e;
printf("Department\tTitle\tDay\tMonth\tYear\n");
while (1){
char a[10]=" ";
char b[10]=" ";
scanf("%s %s %d %d %d",a,b,&c,&d,&e);
addjob(worker,a,b,c,d,e);
printf("Department\tTitle\tDay\tMonth\tYear\n");
print(worker);
}
return 0;
}
void addjob(struct employee_record *rec,
char *department, char *title,
int day, int month, int year){
struct history *new=(struct history*)malloc(sizeof(struct history));
struct employee_record *temp;
new->day=day;
new->department1=department;
new->month=month;
new->year=year;
new->title1=title;
if (rec->head != NULL)
new->next=rec->head;
else {
new->next=NULL;
}
rec->head=new;
}
void print(struct employee_record *rec){
struct history *temp;
temp=rec->head;
printf("%s\t%s\t%d\t%d\t%d",temp->department1,temp->title1,temp->day,temp->month,temp->year);
while(temp->next!=NULL){
printf("\n");
temp=temp->next;
printf("%s\t%s\t%d\t%d\t%d",temp->department1,temp->title1,temp->day,temp->month,temp->year);
}
printf("\n");
}
However,when i key in a second entry,the department and title member of the previous history node gets replaced but not the day month and year as shown below
Why is this so?
The scanf
stores strings in variables a
and b
. The pointers to a
and b
are then passed to the addjob
function. Then the addjob
function copies the pointers into the structure. The structure just has a pointer to the buffers. It does not have a copy of the strings. The next time that scanf
is called it overwrites the contents of the buffer, and the first strings are lost.
The solution is to make a copy of the strings, which you can do three ways
1) declare the struct as
struct history{
char department1[10];
char title1[10];
...
and then use strcpy
to copy the strings into the structure.
2) use strdup
to make a duplicate of the strings
new->department1 = strdup(department);
new->title1 = strdup(title);
The issues with strdup
: it's a non-standard function, and you have to free
the memory when you're done with the strings.
3) use malloc
and strcpy
to duplicate the strings
new->department1 = malloc( strlen(department) + 1 );
strcpy( new->department1, department );
new->title1 = malloc( strlen(title) + 1 );
strcpy( new->title1, title );
This is slightly more work than strdup
but only uses standard functions. You still have to free
the memory when you're done with the strings.
来源:https://stackoverflow.com/questions/32664125/my-program-replaces-all-the-string-data-types-in-all-the-nodes-in-the-linked-lis