【问题标题】:How to count the number of words from a text file in C [duplicate]如何计算C中文本文件中的单词数[重复]
【发布时间】:2013-05-05 11:37:20
【问题描述】:

这是我目前为止的想法。

#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 你好"

【问题讨论】:

  • 好吧,你总是比单词少 1 个空格,因为最后一个单词可能没有空格。你的计数是多少?
  • 在你的 printf 中尝试“w+1”。
  • 我会在ch 上做一个switch
  • 另外,有一个“lastCharWasBlank”标志,如果它是假的,只增加“w”。

标签: c file char word


【解决方案1】:
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;
        }
    }

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 短词(如“a”)呢?
    • 原始提问者在另一个答案的 cmets 中指定他只想计算长度大于两个字符的单词。我同意一个更全面的解决方案将解释像“a”和“an”这样的短词。可能必须检查已知短词列表以区分有效词和随机字母。猜猜这取决于程序的意图是什么。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果没有额外的要求或注意事项(例如,任何空白字符都可以,而不仅仅是' ',连续的空白字符也可以,等等),那么公式就过于简单了:字数就是数字空格加一。

      【讨论】:

      • 这很好用。但是如果我输入一个字符,这个字符就会被当作一个单词。那么我需要一个数组来设置条件 ch>2 吗?还是有其他方法..我不想使用数组..
      • @iG0tB00ts 不。如果您键入一个字符,则有 0 个空格,因此可以正常工作,正确地为单词数提供 1。想想吧。
      • 不,我的意思是.. 如果文件中的文本是 -"word1 word2 w word3"- 那么单个 'w' 将被视为一个单词,因为有一个空格。我希望只有超过 2 个字符的单词才会被计算在内。
      • 啊,这就像现实世界一样——需求从未完全指定。
      • @iG0tB00ts 然后编写代码,计算单字母实体,然后从结果中减去。
      猜你喜欢
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 2013-12-09
      • 2014-08-11
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      相关资源
      最近更新 更多