解析从文件

时间:2015-04-23 21:06:47

标签: c parsing

以下代码是一项计划的一部分,该计划将检查电影评论,看看它们是正面评论还是负面评论。正面和负面是链接列表,每个链接列表存储在前面加载的每个单词大约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);



    }

1 个答案:

答案 0 :(得分:0)

fgets(review, 300, fp);

写入未初始化的内存位置。您需要为review分配内存。您有两种选择:

  1. 使review指向大小为300字节的char数组:

    char* review = NULL;
    char array[300];
    
    review=array; 
    
  2. 使用review / malloccalloc动态分配内存。

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

    然后,使用

    后将其释放
    free(review);
    

    通过检查其返回值来检查malloc / calloc是否没有失败也是一个好主意。它会在失败时返回NULL

  3. 检查fgets是否不返回NULL也是个好主意。