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