2

我必须从文本文件中读取所有单词并输出单词总数、不同单词的数量和最常用的单词。我仍然是初学者,所以任何帮助都很棒。

阅读单词时,连字符/撇号/标点符号被省略,因此 O'connor 与 Oconnor 是同一个单词。<---我不知道该怎么做,所以任何帮助都会很棒。

这是我到目前为止所拥有的,但是现在当我尝试编译它时,它会给我一个警告,strcpy并说我没有正确使用它。单词总数的输出有效,但它给我的不同单词的数量为 0,而最常用的单词则没有。

任何帮助都会很棒,谢谢!

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

int main(int argc, char *argv[])
{
    int number=0;
    int i;
    char *temp;
    char *temp2;
    char word[2500][50];
    int wordCount=0;
    int mostFreq=1;
    char mostFreqWord[2500][50];
    int frequentCount=0;
    int distinctCount=0;
    int j;
    char *p;
    FILE *fp;
    //reads file!
    fp= fopen("COEN12_LAB1.txt", "r");
    if(fp == NULL)                  // checks to see if file is empty
    {
            printf("File Missing!\n");
            return 0;
    }
    while(fscanf(fp,"%s", word) == 1)  //scans every word in the text file
            wordCount++;  //counts number of words
    while(fscanf(fp,"%s",word) == 1)
    {
            for(i=0;i<wordCount;i++)
            {
                    temp=word[i];
                    for(j=0;j<wordCount;j++)
                    {
                            temp2 = word[j];
                            if(strcmp(temp,temp2) == 0)  //check to see if word is repeated
                            {
                                    frequentCount++;
                                    if(frequentCount>mostFreq)
                                    {
                                            strcpy(mostFreqWord,word[i]);  //this doesn't work
                                    }
                            }
                            distinctCount++;
                    }
            } 
    }
    printf("Total number of words: %d\n", wordCount);
    printf("Total number of distinct words: %d\n", distinctCount);
    printf("The most frequently appeared word is: %s \n", &mostFreqWord);
    fclose(fp);
}
4

1 回答 1

1

问题strcpy()在于,正如初学者在他们的回答中所诊断的那样,如果您要复制到mostFreqWord,则需要对其下标,因为它是一个二维数组。

但是,您有一个更根本的问题。您的字数计数循环会一直读取到 EOF,并且您不会倒回文件以重新开始。此外,像这样重新读取文件并不是一个特别好的算法(如果您正在读取从另一个程序输入的数据,则根本不起作用)。

您应该结合这两个循环。计算到达时的单词,但也要清理单词(删除非字母字符 - 或者是非字母数字字符,是否_下划线计数?),然后将其插入到单词列表中(如果还没有的话)如果单词已经出现,则增加该单词的频率计数。

输入阶段完成后,您应该准备好不同单词的数量,并且您将能够通过扫描频率列表以找到最大值(以及出现最大值的索引号)来找到最频繁的单词),然后适当地报告。

于 2013-10-01T02:47:16.517 回答