我正在尝试编写一个打印文本文件中找到的单词数的程序。单词被定义为由任意数量的空格分隔的字符序列。
但是,当有多个空格时我遇到了问题,因为它没有报告正确的单词数。
到目前为止,这是我的代码:
#include <stdio.h>
int main()
{
FILE *fp;
char str;
int i=0;
/* opening file for reading */
fp = fopen("myfile.txt" , "r");
if(fp == NULL) {
perror("Error opening file");
return(-1);
}
while(( str = fgetc(fp)) != EOF ) {
if (str == ' ')
++i;
}
printf("%d\n", i);
fclose(fp);
return(0);
}
myfile.txt是:
Let's do this! You can do it. Believe in yourself.
我不确定我是否使用fgets,fscanf或fgetc。
假设我在读取字符串时在fscanf函数中定义了空格
它打印14不对。我不知道如何考虑多个空格。在这种情况下,空格是单词之间的任意数量的空格。
答案 0 :(得分:1)
只有在没有任何其他空格的情况下计算空格才能完成。
#include <stdio.h>
int main()
{
FILE *fp;
char str;
char prevchar; //tracks the previous character
int i=0;
/* opening file for reading */
fp = fopen("myfile.txt" , "r");
if(fp == NULL) {
perror("Error opening file");
return(-1);
}
prevchar='x'; //initialize prevchar to anything except a space
while(( str = fgetc(fp)) != EOF ) {
if (str == ' ' && prevchar!=' ') // update the count only if previous character encountered was not a space
++i;
prevchar=str;
}
printf("%d\n", i+1);
fclose(fp);
return(0);
}
编辑:代码假定单词由一个或多个空格分隔,并且不包括所有的边角情况,例如当句子分布在多行上或者单词用逗号而不是空格分隔时。但是可以通过添加更多条件来涵盖这些情况。
答案 1 :(得分:1)
只需使用一个小状态图,有两种情况,或者你在一个单词中,或者你在一个单词之外
#include <stdio.h>
int main()
{
FILE *fp;
char str;
int i=0,inside_word =0;
/* opening file for reading */
fp = fopen("myfile.txt" , "r");
if(fp == NULL) {
perror("Error opening file");
return(-1);
}
inside_word =0;
while(( str = fgetc(fp)) != EOF ) {
if (str == ' ' || str == '\n' || str == '\t')
inside_word = 0;
else if(inside_word == 0){
i++;
inside_word=1;
}
}
printf("%d\n", i);
fclose(fp);
return(0);
}
答案 2 :(得分:0)
首先我想到的是,在++ i之后添加另一个while循环以消耗空格字符。
顺便说一句,要小心你的术语,你不是在处理你只是在处理太空人物的空白。 \ t和\ n也是空格!
答案 3 :(得分:-1)
如何使用正则表达式,例如'!\ s +!'替换为单个空格'',然后继续使用您的代码