如何计算C中文本文件中的单词数

时间:2013-05-10 17:55:00

标签: c file char word

这是我到目前为止所提出的。

#include<stdio.h>
main()
{
int w=0, v=0, c=0, cnt=0;
char inp[21]="abcd aeiou hi there", ch;
FILE *read, *write;

write = fopen("D:/wordvowelcharacter.txt", "w");
fprintf(write, "%s", inp);

fclose(write);

read = fopen("D:/wordvowelcharacter.txt", "r");

if (read==NULL)
{
    printf("Error opening file");
}

while ((ch=fgetc(read))!=EOF)
{
    if (ch!=' ')
    {
        c++;
    }

    if          (ch=='A'||ch=='a'||ch=='E'||ch=='e'||ch=='I'||ch=='i'||ch=='O'||ch=='o'||ch=='U'||ch=='u')
    {
        v++;
    }

    if (ch==' ')
    {
        w++;
    }

}
printf("Character %d Vowel %d Word %d", c, v, w);

}

- 代码结束 -

最后一个if语句是递增字数。我应该放在什么条件?当前条件给出了错误的单词数,即仅有空格数。 文件中的文字是: “abcd aeiou hi there”

4 个答案:

答案 0 :(得分:1)

如果没有额外的要求或警告(例如,允许任何空白字符,而不仅仅是' ',可以允许连续的空格字符等),那么公式过于简单:单词的数量是空格数加一。

答案 1 :(得分:1)

我发现您的实施存在一些问题。首先,你假设任何不是空格的东西都是字母字符。标签,换行符,标点符号等怎么样?其次,如果两个单词只用换行符分隔,那么你的代码就不会选中它,因为它只检查空格分隔的单词。

ctype.h标头提供了用于确定字符是否为空格,字母数字,标点符号等的有用函数。有关详细信息,请参阅GNU C Manual - Classification of Characters。像下面这样的东西应该产生更强大的结果。

考虑到您在其他帖子中的评论需要一个单词超过两个字符,代码变为:

#include <stdio.h>
#include <ctype.h>

int main()
{
  int w=0, v=0, c=0, cnt=0;
  int inword = 0;
  char *inp = "hi there, w w w here's\nmore than\none line.\nAnd contractions and punctuation!";
  char ch;
  FILE *read, *write;

  write = fopen("character.txt", "w");
  fprintf(write, "%s", inp);

  fclose(write);

  read = fopen("character.txt", "r");

  if (read==NULL)
  {
    printf("Error opening file");
  }


  while ((ch=fgetc(read))!=EOF)
  {
    if (isspace(ch))
    {
      if (inword > 2)
      {
        w++;
      }
      inword = 0;
    }
    else if (isalpha(ch) || ispunct(ch)) {
      inword++;

      if (isalpha(ch))
      {
        c++;
        if (ch=='A'||ch=='a'||ch=='E'||ch=='e'||ch=='I'||ch=='i'||ch=='O'||ch=='o'||ch=='U'||ch=='u')
        {
          v++;
        }
      }
    }
  }

  if (inword > 2) w++;

  printf("Character %d Vowel %d Word %d\n", c, v, w);

  return 0;
}

答案 2 :(得分:0)

假设你的字符串永远不会以空格开头,最简单的方法就是将你的w增加1。

答案 3 :(得分:0)

enum status { out, in };
...
    enum status stat = out;
...
    while ((ch=fgetc(read))!=EOF){
        if (ch!=' '){
            if(stat == out)w++;
            stat = in;
            c++;
        }

        if(ch=='A'||ch=='a'||ch=='E'||ch=='e'||ch=='I'||ch=='i'||ch=='O'||ch=='o'||ch=='U'||ch=='u')
        {
            v++;
        }

        if (ch==' '){
            stat = out;
        }
    }