【问题标题】:Trying to count the number of words in a file [closed]试图计算文件中的字数[关闭]
【发布时间】:2016-05-02 21:41:01
【问题描述】:

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

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

【问题讨论】:

  • 我对 C 不太熟悉,但你能把你的文件读成一个很大的长字符串,然后用空格分割,然后得到 array.Length 属性吗?
  • 但是你最好的朋友是一个代码格式化程序。单间距和合理的缩进真的很有用。
  • 它适用于单行,但是当我有包含 60 个单词的文本时,它会低估它:/
  • 您可能还想将换行符算作空格...
  • @Eugene Sh.天才。那行得通。现在我需要解释为什么我的数组在文件末尾搞砸了。文件中的内容:gyazo.com/d7a6b3bd1fd5ae843d5d427e72980f28 数组中文件的输出:gyazo.com/bdc1d73827ae61d80fc3a3e203a3c987

标签: c arrays function isspace


【解决方案1】:

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

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

使用int 保存来自fgetc() 的结果,因为这会返回unsigned char 和EOF 范围内的int。通常有 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);
}

【讨论】:

  • 哇,这是我代码的精简版。谢谢,我会学习的。
【解决方案2】:

不要这样做

*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 )

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 2014-01-20
  • 1970-01-01
  • 2015-01-08
  • 2015-06-14
  • 1970-01-01
  • 2013-07-23
相关资源
最近更新 更多