簡體   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