从.txt文件创建字符串列表

时间:2016-02-04 17:10:22

标签: c string pointers malloc dynamic-memory-allocation

我试图创建一个字符串列表来读取.txt文件中的单词。我的代码仅在.txt文件包含少量单词时才有效,我无法弄清楚原因,我认为这是我的代码内存分配问题。

#include <stdio.h>
#include <stdlib.h> struct s_nodo {
    char* word;
    struct s_nodo*sig; }; typedef struct s_nodo* t_nodo;

void add (t_nodo*,char*); void print(t_nodo);

int main() {
    char aux[30];
    t_nodo lista=NULL;
    FILE*fd;
    fd=fopen("c:\\texto.txt","r");
    while(!feof(fd))
    {
        fscanf(fd,"%s",aux);
        add(&lista,aux);

    }
     print(lista);
    return 0; }



void add (t_nodo*lista,char *aux) {

    if(*lista==NULL)
    {
        *lista=malloc(sizeof(t_nodo));
        (*lista)->word=malloc((strlen(aux+1))*sizeof(char));
        strcpy((*lista)->word,aux);
        (*lista)->sig=NULL;

    }
    else add (&(*lista)->sig,aux);

}

void print (t_nodo lista) {
    if(lista!=NULL)
    {
        printf("-%s-",lista->word);
        print(lista->sig);
    }

}

2 个答案:

答案 0 :(得分:3)

您正在为指针结构的大小分配内存,而您需要为结构本身的大小分配内存。

更改

  *lista=malloc(sizeof(t_nodo));

  *lista=malloc(sizeof(struct s_nodo));

此外,您使用错误的表达式将内存分配给word

(*lista)->word=malloc((strlen(aux+1))*sizeof(char));

应该是

(*lista)->word=malloc( (strlen(aux) + 1 );  //sizeof(char) == 1 in C

如上所述,请参阅Why is “while ( !feof (file) )” always wrong?

答案 1 :(得分:1)

你的编码风格会导致这个错误

(*lista)->word=malloc((strlen(aux+1))*sizeof(char));
                        //       ^
  1. 不要使用sizeof(char),因为它是1,这是强制性的,它只是帮助您忽略了这个问题。
  2. 使用更多的空白区域,可以在您眼前轻松分开令牌。
  3. 在使用指针之前,请务必检查malloc()是否未返回NULL
  4. 所以它应该是

    (*lista)->word = malloc(strlen(aux) + 1);
    

    现在看看它是如何清晰的,不是吗?