我有一个名为myf
的文件,其中包含大量文字,我试图使用空格作为计算单词数量的方法。基本上,在我的程序的count方法中,有一个变量int d,它的作用类似于布尔函数。此外,还有一个名为count
的增量器。
我有一个for
循环,它将遍历放入方法计数参数的数组,并查看指针*p
是否为非字母。如果是非字母AND d=0
,d=1
和count
会递增。这样,如果下一个字符也是非空格,则从d=1
开始,else if语句将不会再次递增。 d重置为0的唯一方法是,如果有空格,此时,如果找到另一个字母,它将再次递增。然后方法计数将返回变量计数。看起来很简单,但我一直得错了。
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include <ctype.h>
int count(char x[]) {
int d = 0;
int count = 0;
for (char *p = x; *p != EOF; *p++) {
// this will traverse file
printf("%c", *p);
// this is just to see the output of the file
if (*p == ' ' && d == 1) {
d = 0;
}
else if (*p != ' ' && d == 0) {
count++;
d = 1;
}
}
return count;
}
int main() {
char c;
int r = 0;
char l[1000];
FILE *fp = fopen("myf", "r");
while ((c = fgetc(fp)) != EOF) {
l[r] = c;
r++;
}
printf("\n %d", count(l));
}
答案 0 :(得分:2)
要计算单词数,请计算非字母后字母的出现次数。
*p != EOF
是错误的测试。 EOF
表示输入操作1)没有更多输入或2)发生输入错误。它不表示字符串的结尾。
使用int
保存fgetc()
的结果,因为它会返回int
和unsigned char
范围内的EOF
。通常有257个不同的值。 char
不足。
小东西:不需要阵列。让代码将'
视为一封信。由于单词的数量可能非常大,所以让代码使用类似unsigned long long
的宽泛类型。
#include <ctype.h>
int isletter(int ch) {
return isalpha(c) || c == '\'';
}
#include <stdio.h>
int main(void) {
unsigned long long count = 0;
FILE *fp = fopen("myf", "r");
if (fp) {
int c;
int previous = ' ';
while ((c = fgetc(fp)) != EOF) {
if (!isletter(previous) && isletter(ch)) count++;
previous = ch;
}
fclose(fp);
}
printf("%llu\n", count);
}
答案 1 :(得分:0)
不要这样做
*p != EOF
EOF实际上是一个负整数,你将它用作char。你应该传入你想要迭代的字符数,即
int count(char x[], int max){
然后使用for循环,如
int m = 0;
for ( char *p = x; m < max; p++, m++)
注意我也将*p++
更改为p++
。您还需要更新程序以考虑非空间等事项,即此行
else if (*p != ' ' && d==0 )
当遇到\n
时会发生什么,它可能会计入一个额外的单词。