-1

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

我有一个for循环,它将遍历放入方法计数参数的数组,并查看指针*p是否为非字母。如果它是非字母 AND d=0d=1count递增。这样,如果下一个字符也是非空格,d=1那么 else if 语句将不会再次递增。d 重置为 0 的唯一方法是如果存在空格,此时如果找到另一个字母,它将再次递增。然后方法count将返回变量count。看起来很简单,但我总是得到错误的数字。

#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));
}
4

2 回答 2

2

要计算单词的数量,请在非字母之后计算一个字母的出现次数。

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

用于int保存结果,fgetc()因为它返回和int范围内unsigned charEOF。通常有 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);
}
于 2016-05-02T22:02:29.327 回答
0

不要这样做

*p != EOF

EOF 实际上是一个负整数,您将它用作字符。您应该传入要迭代的字符数,即

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 )

当它遇到 a 时会发生什么\n,它可能会计算一个额外的单词。

于 2016-05-02T21:50:49.157 回答