试图计算文件中的单词数

时间:2016-05-02 21:41:02

标签: c arrays function isspace

我有一个名为myf的文件,其中包含大量文字,我试图使用空格作为计算单词数量的方法。基本上,在我的程序的count方法中,有一个变量int d,它的作用类似于布尔函数。此外,还有一个名为count的增量器。

我有一个for循环,它将遍历放入方法计数参数的数组,并查看指针*p是否为非字母。如果是非字母AND d=0d=1count会递增。这样,如果下一个字符也是非空格,则从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));
}

2 个答案:

答案 0 :(得分:2)

要计算单词数,请计算非字母后字母的出现次数。

*p != EOF是错误的测试。 EOF表示输入操作1)没有更多输入或2)发生输入错误。它表示字符串的结尾。

使用int保存fgetc()的结果,因为它会返回intunsigned 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时会发生什么,它可能会计入一个额外的单词。