使用fscanf计算单词的出现次数

时间:2014-05-08 09:07:44

标签: c scanf

我必须编写一个程序来分配扫描文本文件并说出有多少句子(基于句号,没有其他标点符号)总数的单词数和一定的总数字出现了。我可以得到总工作数量,但具体的字数和句子数量让我望而却步,我相信我们应该使用fscanf。这就是我所拥有的

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
FILE *datafile;
int main(){
    int count1, count2, leng, sentences ;
    char filename[50], word[120], sentence[120];
    printf("Enter a word :");
    gets(word);
    printf("Enter the filename:");
    gets(filename);
    datafile = fopen(filename, "r");
    if(datafile == NULL) {
        printf("Error , Can not open %s", filename);
        exit(249);
    }

    leng = 0;
    count2 = 0;
    sentences = 0;

    while (fscanf(datafile, "%s", word) == 1) {     //this one works
        ++leng;
    }
    while (!feof(datafile))
    { 
        fscanf(datafile,"%s",word);
        if (strcmp(word,"the")==0)
            count2++;
    }

    while(fscanf(datafile, "%s", word) == '.') {
        ++sentences;
    }
    printf("There are a total of %d words\n", leng);
    printf("The word '%s' appears %d times\n", word, count2);
    printf("There are %d sentences", sentences);

}

当我运行它时,这就是我得到的

我尝试了两种不同的方法来计算句子数和特定的字数,我真的不明白为什么第一个也能工作,我想如果我有一个其他的将是相同的格式。任何帮助或建议表示赞赏。

3 个答案:

答案 0 :(得分:2)

您的代码存在一些问题。

  • 您在连续三个循环中读取文件。但是,从不输入第二个和第三个循环,因为在使用fscanf扫描文本后,文件已耗尽。您可以在重新阅读之前rewind您的文件,但最好一次完成所有三项计数。
  • 您可以将变量word用于各种事物:用户指定的单词和扫描单词的临时缓冲区。这就是你的截图显示“1972”的原因。作为要查找的单词,而不是用户输入的“。”。 (当计算这个词时,你会检查硬编码的单词“the”。)
  • fscanf的返回值是成功匹配的%项的数量或表示已到达文件末尾的特殊值EOF。您已在第一个循环中正确使用此功能。请不要在feof添加额外的支票,因为它的行为并不像大多数人认为的那样,请参阅this self-answered question
  • 在查找句点时使用fscanf的方式在语法上是正确的,因为它在int中返回int和点'.'的ASCII值,但是不是你想要的。具有fscanf格式的%s返回字符串,而不是单个字符。另请注意,fscanf没有相同的句子和标点符号概念:完全停止可能位于字符串末尾,如屏幕截图中的"1972."。因此,您应该检查单词是否有句号。您可以使用strchr
  • 执行此操作

答案 1 :(得分:1)

我给你一些提示:

要获得句子数,您可以将strtok与分隔符一起用作"."(句号)。

要获取字数,请将strtok与分隔符一起使用" "(空格)。

要获得单词重复计数,您可以使用strstr并搜索该特定单词。

<强>更新 要使用strstr,您可以使用fgets将文件内容(逐行)读入缓冲区字符串,然后使用strstr查找该句子/字符串中的特定单词,然后再次将下一句话读入缓冲区字符串(再次使用fgets),依此类推,直至到达End-Of-File

详细了解这些功能:fgetsstrstrstrtok

答案 2 :(得分:1)

完整的程序在这里:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
FILE *datafile;
int main(){
    int count1, count2, leng, sentences ;
    char filename[50], word[120],word1[120] ,sentence[120];//word1 is new string
    printf("Enter a word :");
    gets(word1);
    printf("Enter the filename:");
    gets(filename);
    datafile = fopen(filename, "r");
    if(datafile == NULL) {
        printf("Error , Can not open %s", filename);
        exit(249);
    }

    leng = 0;
    count2 = 0;
    sentences = 0;

    while (fscanf(datafile, "%s", word) == 1) {     //this one works
        ++leng;

        if (strcmp(word,word1)== 0)//strcmp returns 0 when it matches word to word1
            count2++;

        if ( strchr(word,'.') != NULL )//strchr returns a pointer when it matches word to '.' null otherwise
            ++sentences;
    }

    printf("There are a total of %d words\n", leng);
    printf("The word '%s' appears %d times\n", word1, count2);
    printf("There are %d sentences", sentences);

    return 0;
}

查看各种字符串函数并返回值。 Here