2013-12-04 3 views
2

Я пишу программу, которая подсчитывает количество раз, когда слово происходит в текстовом файле. Это делается с помощью структуры, содержащей слово и счетчик этого слова. Я получаю компиляции я получаю сообщение об ошибке, что читает:Недопустимое применение sizeof для завершения struct wordcounter

"Invalid application of sizeof to incomplete type struct wordcounter."

Любой вход на том, как исправить эту проблему и о моем коде вообще ценится. Я новичок в c, поэтому я открыт для консультаций, не связанных с этим вопросом. Большое спасибо. Мой код:

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
#include <stdlib.h> 

#define MAXWORDS 5000 
#define MAXLINE 1000 
#define MAXWORDLEN 100 


int count = 0; 
struct wordcount *wordPtr[MAXWORDS]; 

typedef struct wordcount *wordcountptr; 

typedef struct wordcount { 
    char word[50]; 
    int count; 
} wordcount; 


main() 
{ 

    int wordfound = 0; 
    int len; 
    char line[MAXLINE]; 
    int printcount; 

    while ((len = getline(line, MAXLINE, stdin))> 0) 
    { 
     int i = 0; 
     int j = 0; 

     for(; i<len; i++) 
     { 
      if(line[i] != isalnum(line[i]) && line[i] != 32) 
       line[i] = 32; 
      else 
       line[i] = tolower(line[i]); 
     } 

     for(; j<len; j++) 
     { 

      char currentword[MAXWORDLEN]; 

      if(line[j] != 32) 
      { 
       for(i=0; line[j] != 32; i++) 
        currentword[i] = line[j]; 
      } 
      if(line[j] == 32) 
      { 
       for(i=0;i<MAXWORDS; i++) 
       { 
        if(strcmp(currentword, (*wordPtr[i]).word) == 0) 
        { 
         (*wordPtr[i]).count++; 
         wordfound = 1; 
        } 
       } 

       if(wordfound == 0) 
       { 
        wordPtr[i] = (struct wordcounter*)malloc(sizeof(struct wordcounter)); 
        strcpy((*wordPtr[i]).word, currentword); 
        (*wordPtr[i]).count = 1; 
        count++; 
       } 
      } 
      wordfound = 0; 
     } 
    } 

    for(printcount = 0; printcount < count; printcount++) 
     printf("There are %d occurances of the word %s\n", (*wordPtr[printcount]).count, (*wordPtr[printcount]).word); 

    for(printcount = 0; printcount < MAXWORDS; printcount++) 
    { 
     free((void*)wordPtr[printcount]); 
     wordPtr[printcount]= NULL; 
    } 
} 
+1

'wordcount' =' wordcounter'. Проверьте имя объявления и имя, которое вы использовали в коде. Там более одного, кстати. – WhozCraig

+0

Я реализую getline неправильно? Я получаю предупреждение о моих аргументах. Также теперь я получаю ошибку времени выполнения: ошибка сегментации (сбрасывание ядра). – Atache

ответ

2
typedef struct wordcount { 
    char word[50]; 
    int count; 
} wordcount_t;//modify like this 

wordPtr[i] = (wordcount_t*)malloc(sizeof(wordcount_t));//modify like this 
+0

Спасибо, что сработало. Таким образом, проблема имела какое-то отношение к тому, чтобы не определить экземпляр структуры? – Atache

+0

Теперь я получаю ошибку времени выполнения: ошибка сегментации (сбрасывается ядром). Я понимаю, что это связано с попыткой доступа к памяти, которая не была выделена. Я правильно использую getline? Я получаю предупреждения об этом и задаюсь вопросом, вызывает ли это это. – Atache

+1

'ssize_t getline (char ** lineptr, size_t * n, FILE * stream);' это прототип 'getline', первый аргумент -' char ** ', а не' char * ', вы можете использовать вот так: 'getline (& line, MAXLINE, stdin)' – sundq

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