繁体   English   中英

在 C 中使用指针向链表添加值而不使用 strdup()

[英]Use pointer to add value to linked list without using strdup() in C

我目前遇到了一个问题。 运行我的程序时,链表中的所有值都会更改为存储要添加到链表的值的指针的新值。 我发现该问题的解决方案是strdup() ,但是,由于它不是 C 标准的一部分,我想知道是否有其他方法可以在不使用strdup()的情况下解决此问题。


#include <stdio.h>
#include<string.h>
#include <stdlib.h>
#include <string.h>
#define _XOPEN_SOURCE 500

struct library {
    char *title;
    int num_books;
    struct library *next;
};
typedef struct library libptr;

void printList(struct library **head) {

  while (*head != NULL) {
    printf("%s\n", (*head)->title);
    *head = (*head)->next;
  }

}



void add_book(struct library **ptr,char value[50]){
    libptr *newPtr;
    libptr *prevptr;
    libptr *currentptr;
    newPtr = (libptr *)malloc(sizeof(libptr));
    if(newPtr!=NULL){
        newPtr -> title = value;
        newPtr -> next = NULL;
        prevptr = NULL;
        currentptr = *ptr;

        while(prevptr != NULL && value > currentptr->title)
        {
          prevptr = currentptr;
          currentptr = currentptr->next;
        }
        if(prevptr == NULL)
        {
          newPtr->next = (*ptr);
          (*ptr) = newPtr;
        }
        else{
          prevptr->next = newPtr;
          newPtr->next = currentptr;
        }
    }
    else{
        printf("%s is not inserted. No memory available",value);
    }

}

int main(){
    char title[50], line[200];
    libptr *new_book = NULL;
    FILE* file = fopen("library.txt", "r");

    while (fgets(line, sizeof(line), file)) {
      add_book(&new_book, strdup(line));
    }

    printList(&new_book);

    fclose(file);
}

library.txt文件的内容:

aaa
bbb
ccc

您将指针与其指向的值混淆了。 如果您从代码中删除strdup ,则链表中的所有指针最终都指向同一个 char 数组,因此如果/当您更改该 char 数组中的字符串时,所有指针都会看到它。 因此,要为链表的每个元素提供不同的字符串,每个元素的指针必须指向不同的 char 数组。

使用strdup就是这样做的,使用malloc创建一个大小正确的新 char 数组,并将字符串复制到该 char 数组中。 因此,每个指针最终都指向一个不同的 char 数组,每个指针(可能)都有不同的字符串。 要(安全地)摆脱 strdup,您需要以其他方式做同样的事情——为每个字符串创建一个新数组,这样您就可以让指针指向它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM