У меня ошибка сегментации в getc (), который читает из файла

0
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

  • 1
    Скорее всего, fopen не удалось и вернул NULL . Я не могу не заметить, что вы не проверяете возвращаемое значение перед передачей его в getc .
  • 0
    <code> if (file! = NULL) {while ((ch = getc (file))! = EOF) {word [0] = ch; слово ++; буквы ++; if (isalpha (ch)! = 0) {word [0] = 0; слово - буквы; буквы = 0; значение = HashKey (слово, таблица); Put (слово, значение, таблица); } printf ("% c", ch); }} else {perror (inputFile); / * почему файл не открылся? * /} </ code>
Показать ещё 8 комментариев
Теги:
algorithm
hash
segmentation-fault

1 ответ

2
Лучший ответ

Проблема связана со строкой:

word++;

который продолжает увеличивать указатель слова, который затем никогда не возвращается к началу буфера. Таким образом, в конечном итоге word указывает на выделенные 32 байта.

Думаю, вы намеревались сбросить указатель с помощью строки:

word - letters;

Однако это утверждение не имеет никакого эффекта. Вместо этого вы должны использовать:

word -= letters;

Другим (на мой взгляд, более безопасным) способом справиться с этим может быть использование индекса (например, word[letters]) и сохранение константы word или периодического сброса указателя с другого указателя константы, указывающего в начале буфера.

  • 0
    хорошо, причина, по которой я делаю это таким образом, состоит в том, что функции были даны мне, и они принимают указатели. но я приму любые предложения! (если они используют указатели)
  • 1
    Другие предложенные мной подходы не меняют способ использования HaskKey и Put , а только способ обработки word локального указателя. Но все, что работает для вас.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню