2014-11-21 7 views
0

Я пишу простую функцию, которая принимает в качестве входных 3 уже открытых FILES, затем просматривает каждый символ в файле, заполняя массив символов до тех пор, пока не будет достигнут пробел или не будет указана новая строка. найденный. Тем не менее, мой метод заполнения массива продолжает давать мне Segmentation fault, и я не совсем уверен, почему. На данный момент я просто пытаюсь напечатать, чтобы утешить слова, которые были заполнены в массиве word [], а затем очистить его с помощью memset для следующего слова.C Чтение слов из текстового файла

hash_table_t training(FILE *D1, FILE *D2, FILE *D3, int size) 
{ 

char *word[200]; 
char c; 
int i = 0; 

while ((c = fgetc(D1)) != EOF) 
{ 
    while (((c>='a') && (c<='z')) || ((c>='A') && (c<='Z'))) 
    { 
     //add to char array 
     *word[i++] = c; 
    } 
    if(c == ' ' || c=='\n') 
    { 
     //hash word (print chars for now) 
     for (i=0; *word[i] != ' '; i++) 
     { 
      printf("%c", *word[i]); 
     } 

    } 
    memset (word, ' ', 20); 

} 

fclose(D1); 
fclose(D2); 
fclose(D3); 
} 

ответ

1

Ваш массив word - это массив указателей, а не массив символов.
Вы должны изменить

char* word[200]; 

в

char word[200]; 

и

*word[i]; 

в

word[i]; 
+0

Вам также нужно будет изменить использование слова «word» в другом месте. –

+0

@ScottHunter благодарит за напоминание. Сообщение слишком быстро. – SSC

0

Вы объявили word как массив указатели характера , назначать их символов и попытаться разыменовать эти значения.

-1

Переменная «слово», как вы заявили, это не массив символов/cstring, но это указатель на строку размером 200; это сработает, но вы не инициализировали строку с помощью «malloc», следовательно, ошибку «Ошибка сегментации», поскольку вы пытаетесь изменить часть памяти, не выделенную вашей программе.

Редактировать: Также, как подсказка, всегда инициализируйте указатели, как только создание; потому что они указывают на случайные части памяти при создании, код может не всегда давать вам ошибку «Ошибка сегментации», поскольку он может указывать на часть памяти, выделенную вашей программой. В худшем случае у вас будет очень сложная ошибка.

+0

Как тогда вы бы объявить массив из 200 указателей на символы? –

+0

Объявление не является проблемой, проблема в том, что вы не инициализировали их: char * word [200] = malloc (200 * sizeof (char)); – Arce

+0

@Arce 'char * word [200]' - это массив из 200 'char *' ... указателем на массив из 200 'char' будет' char (* word) [200] ' – Dmitri

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