1

到目前为止,这是我想出的。

#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

4 回答 4

1

我看到您的实施存在一些问题。首先,您假设任何不是空格的都是字母字符。制表符、换行符、标点符号等呢?其次,如果两个单词仅由换行符分隔,您的代码将不会选择它,因为它只检查以空格分隔的单词。

ctype.h 标头提供了用于确定字符是否为空格、字母数字、标点符号等的有用函数。有关更多信息,请参见GNU C 手册 - 字符分类。像下面这样的东西应该会产生更强大的结果。

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

#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;
}
于 2013-05-10T20:34:50.810 回答
1

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

于 2013-05-10T17:57:51.790 回答
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;
        }
    }
于 2013-05-10T23:16:29.420 回答
0

假设您的字符串从不以空格开头,那么最简单的方法就是将 w 增加 1。

于 2013-05-10T18:07:51.350 回答