void CalculateWordFrequency(char* inputFile){
char* word= malloc(sizeof(char)*32);
char ch;
int count, letters=0, value;
FILE *file = fopen (inputFile, "r");
Hashtable* table = malloc(sizeof(table));
Init(table);
if ( file != NULL )
{
while((ch=getc(file))!=EOF)
{
word[0] = ch;
word++;
letters++;
if(isalpha(ch)!= 0){
word[0] = 0;
word - letters;
letters = 0;
value = HashKey(word,table);
Put(word ,value,table);
}
printf("%c", ch);
}
}else{
perror ( inputFile ); /* why didn't the file open? */
}
}
Я пытаюсь получить слова из документа.txt и сделать хеш-таблицу со всеми словами и количеством явлений...
моя проблема в том, что getc() читает недопустимый символ и дает мне ошибку сегментации. некоторые из текста из файла:
Хэш-стол Из Википедии, свободной энциклопедии Не путать с хеш-листом или хэш-деревом. Hash table Тип Unordered ассоциативный массив Invented 1953 Сложность времени в большой нотации O Среднее Worst case Пространство O (n) [1] O (n) Поиск O (1) O (n) Вставка O (1) O (n) Удаление O ( 1) O (n) Маленькая телефонная книга как хэш-таблица.
и ошибка: Хэш-таблица Из Википедии, свободной энциклопедии
Программный сигнал SIGSEGV, ошибка сегментации. 0x000000321dc67f3e в getc() из /lib64/libc.so.6
Проблема связана со строкой:
word++;
который продолжает увеличивать указатель слова, который затем никогда не возвращается к началу буфера. Таким образом, в конечном итоге word
указывает на выделенные 32 байта.
Думаю, вы намеревались сбросить указатель с помощью строки:
word - letters;
Однако это утверждение не имеет никакого эффекта. Вместо этого вы должны использовать:
word -= letters;
Другим (на мой взгляд, более безопасным) способом справиться с этим может быть использование индекса (например, word[letters]
) и сохранение константы word
или периодического сброса указателя с другого указателя константы, указывающего в начале буфера.
HaskKey
и Put
, а только способ обработки word
локального указателя. Но все, что работает для вас.
fopen
не удалось и вернулNULL
. Я не могу не заметить, что вы не проверяете возвращаемое значение перед передачей его вgetc
.