我必须编写一个程序来分配扫描文本文件并说出有多少句子(基于句号,没有其他标点符号)总数的单词数和一定的总数字出现了。我可以得到总工作数量,但具体的字数和句子数量让我望而却步,我相信我们应该使用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);
}
当我运行它时,这就是我得到的
我尝试了两种不同的方法来计算句子数和特定的字数,我真的不明白为什么第一个也能工作,我想如果我有一个其他的将是相同的格式。任何帮助或建议表示赞赏。
答案 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
。
答案 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!