我的程序替换了链表中所有节点中的所有字符串数据类型 [英] My program replaces all the string data types in all the nodes in the linked list
问题描述
我有一个程序,该程序基本上将一个履历(节点)添加到employee_record(链接列表)中.
I have a program that basically adds a history(node) to the employee_record(linked list).
这是我的代码:
#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
为什么会这样?
推荐答案
scanf
将字符串存储在变量a
和b
中.然后将指向a
和b
的指针传递给addjob
函数.然后addjob
函数将指针复制到结构中.该结构仅具有指向缓冲区的指针.它没有字符串的副本.下次调用scanf
时,它将覆盖缓冲区的内容,并且第一个字符串丢失.
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)将结构声明为
struct history{
char department1[10];
char title1[10];
...
,然后使用strcpy
将字符串复制到结构中.
and then use strcpy
to copy the strings into the structure.
2)使用strdup
复制字符串
new->department1 = strdup(department);
new->title1 = strdup(title);
strdup
的问题:这是一个非标准函数,使用完字符串后,您必须free
内存.
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)使用malloc
和strcpy
复制字符串
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 );
这比strdup
略多,但仅使用标准功能.完成字符串操作后,您仍然必须free
内存.
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.
这篇关于我的程序替换了链表中所有节点中的所有字符串数据类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!