2015-10-09 4 views
1

Файл, который я читаю, имеет только имена, разделенные линией. Случается, что программа пытается распечатать содержимое line_array и распечатает около 20 из последней строки в txt-файле.Проблемы с файловыми вводами и строковыми массивами

#include <stdio.h> 

FILE* fp; 

int main(){ 

    char* line; 
    const char* line_array[255]; 
    int i= 0; 
    int b =0; 
    fp = fopen("noob.txt","r"); 

    while(fgets(line,255,fp)){ 
     line_array[i]=line; 
     printf("%s",line); 
     printf("%s",line_array[i]); 
     i++; 
    } 

    for(;b<i;b++){ 
     printf("%s",line_array[b]); 
    } 
    fclose(fp); 
    return 0; 
} 
+2

1) 'char * line;' -> 'char line [255];' 2) 'line_array [i] = line;' -> 'line_array [i] = strdup (строка);' // strdup в BLUEPIXY

ответ

1

Первый выпуск, в вашем коде,

while(fgets(line,255,fp)) 

line используется неинициализированным. Память не выделена line. Он вызывает undefined behavior.

После этого вы не проверили успех fopen() перед использованием возвращаемого указателя файла. Опять же, возможно UB.

И, наконец, говоря

line_array[i]=line; 

, что вы сделали это, чтобы сохранить саму line всех вхождений line_array[n], так и для последующего printf() цикла, последнее содержание line печатается снова и снова еще раз.

Решение (ы):

  • Выделение памяти для line или использовать фиксированную длину массива.
  • Перед использованием возвращаемого указателя проверьте успех fopen().
  • Выделите память для каждого line_array[n] и используйте strcpy(), чтобы скопировать содержимое. В противном случае вы можете напрямую использовать strdup().
Смежные вопросы