2015-04-23 2 views
1

Код ниже относится к программе, которая проверяет обзоры фильмов и оценивает ли они положительные отзывы или негативные отзывы. Положительные и отрицательные - это связанные списки, в которых хранится около 2000 слов в каждом, которые были загружены ранее. Я пытаюсь прочитать в файле обзора эти две функции и определить, являются ли они положительными или отрицательными. Это правильный способ попробовать и прочитать во всем файле, а затем разделить его по слову, чтобы узнать, положительно или отрицательно. Я перехватываю строку fgets, поэтому я делаю что-то неправильно, но я не уверен, что.Анализ строки, считанной из файла

int check_word(node* positive, node* negative, char* word) 
    { 
     while(positive->nextPtr != NULL) 
     { 
      if(strcmp(positive->word,word) == 0) 
      { 
       return 1; 
      } 
      else 
      { 
       positive = positive->nextPtr; 
      } 
     } 

     while(negative->nextPtr != NULL) 
     { 
      if(strcmp(negative->word,word) == 0) 
      { 
       return -1; 
      } 
      else 
      { 
       negative = negative->nextPtr; 
      } 
     } 

     return 0; 
    } 
    void evaluate_review(node* positive,node* negative, char* file) 
    { 
     FILE* fp = fopen(file,"r"); 
     char* token = NULL; 
     char* review = NULL; 
     int positive_words = 0; 
     int negative_words = 0; 

     fgets(review, 300, fp); 

     token = strtok(review, " "); 
     while(token != NULL) 
     { 
      if(check_word(positive, negative, token) == 1) 
      { 
       positive_words++; 
      } 
      else if(check_word(positive, negative, token) == -1) 
      { 
       negative_words++; 
      } 

      token = strtok(NULL, " "); 

     } 

     if(positive_words > negative_words) 
     { 
      printf("This review was a postive one\n"); 
     } 

     if(negative_words > positive_words) 
     { 
      printf("This review was a negative one\n"); 
     } 

     fclose(fp); 



    } 
+0

, который сделал трюк, спасибо, вы не можете поверить, что я пропустил это! –

+0

@BrandonTomblinson, чтобы сделать код более удобным для обслуживания, вы можете 'fgets (review, sizeof (review), fp);' тогда изменение размера массива не требует изменения 'fgets()' ... –

+0

Хорошая точка, однако если Я использую массив как размер 300, это не имеет значения, так как я не динамически изменяю фактический размер массива –

ответ

0
fgets(review, 300, fp); 

пишет в неинициализированную ячейку памяти. Вы должны выделить память для review. У вас есть два варианта, чтобы сделать это:

  1. Make review точку в массив char размером 300 байт:

    char* review = NULL; 
    char array[300]; 
    
    review=array; 
    
  2. выделить память динамически для review с помощью malloc/calloc.

    char* review = NULL; 
    
    review = malloc(300); 
    /*OR*/ 
    review = calloc(300 , sizeof(char)); 
    

    , а затем освободить его после его использования с помощью

    free(review); 
    

    Это также хорошая идея, чтобы проверить, если malloc/calloc не преминул, проверяя возвращаемое значение. Он вернет NULL при сбое.

Это также хорошая идея, чтобы проверить, если fgets не возвращает NULL.

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