我的程序替换了链表中所有节点中的所有字符串数据类型 [英] My program replaces all the string data types in all the nodes in the linked list

查看:91
本文介绍了我的程序替换了链表中所有节点中的所有字符串数据类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个程序,该程序基本上将一个履历(节点)添加到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将字符串存储在变量ab中.然后将指向ab的指针传递给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)使用mallocstrcpy复制字符串

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆