2017-01-30 1 views
0

Я пытаюсь прочитать некоторые строки из файла и скопировать их в массив строк. Я не могу понять, почему мне удается правильно прочитать только первую строку в файле, прежде чем получить ошибку сегментации. Я знаю, что каждая строка в файле имеет до 50 символов.Чтение строк из файла и их копирование в массиве - C

... 

int i = 0; 
char s[50]; 
int N=0; 
FILE *fp; 

//Figures out how many strings are stored in the file 
while(fgets(s, 50, fp)!=NULL){N++} 

rewind(fp); 

char *strings[N]; //This is the array where I want to store strings 

for(i=0;i<N;i++){ 

    fgets(s, 50, fp); 
    strcpy(strings[i], s); 
    printf("%s", s); 
} 

Почему я не могу успешно хранить строки в массиве?

+0

Вы не можете использовать 'strcpy' с неинициализированным указателем, используйте' strdup': 'stringings [i] = strdup (s) ; ' –

+1

Подсказка:' char * string [N] '- массив из N указателей, но ни один из них не был инициализирован. Каждый из указателей указывает на некоторое неопределенное расположение памяти. –

+0

@MichaelWalz: Большое спасибо! Поэтому я могу использовать strcpy, но мне нужно инициализировать каждый указатель 'strings [i]'. Считаете ли вы, что после fgets() я должен использовать что-то вроде: 'stringings [i] = (char *) malloc (50 * sizeof (char));'? – davideAlbertini

ответ

0

Вы делаете две ошибки:

1- при копировании строк, вы должны выделить память для назначения, inyour случае назначения строки [я], для которого не выделяется какой-либо памяти

2-ваши строки должны быть нулем

Этот код должен работать:

#define MAX_STRINGS 100 
    int i = 0; 
    char s[50]; 
    int N=0; 
    while(fgets(s, 50, fp)!=NULL){N++;} 
    char strings[MAX_STRINGS][50]; 

    rewind(fp); 
    for(i=0;i<N && i<MAX_STRINGS;i++){ 

     fgets(s, 50, fp); 
     strcpy(strings[i], s); 
     printf("%s", s); 
    } 

Обратите внимание, что если вы не используете векторов, то есть чтобы предварительно определить размер вашего массива, в основном размер массива должен быть константой