2016-02-04 5 views
0

Я пытаюсь создать список строк, читающих слова из TXT-файлов. Мой код работает только тогда, когда файлы .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); 
    } 

} 

ответ

1

Ваш стиль кодирования приводит к этой ошибке здесь

(*lista)->word=malloc((strlen(aux+1))*sizeof(char)); 
         //  ^
  1. Не используйте sizeof(char), потому что это 1, и это обязательно, это только помогло вам упускать из виду эту проблему.
  2. Используйте больше белого пространства, которое легко разделит токены перед вашими глазами.
  3. Всегда проверяйте, чтобы malloc() не возвращал NULL перед использованием указателя.

Так оно и должно быть

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

посмотреть, как теперь ясно, не так ли?

+0

Спасибо, теперь он работает, но я не понимаю, почему я не должен ставить SizeOf (Char), может вы мне объясните? – Marco

+0

Потому что это 1. Вам не нужно и делает это, просто делает код трудным для чтения. –

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?

Смежные вопросы