如何在不使用字符串的情况下计算单词总数?

时间:2016-08-15 05:30:48

标签: c word-count

我实现了这个代码以获得no。的话数。它适用于所有单个字符,即如果我输入"q w r "作为输入,它会给我3个单词,但当我输入"qwe ed df "作为输入时,它会显示2。

#include<stdio.h>
int main()
{
    int c=getchar();

    int words=0;

    while(c!=EOF)
    {
        if(c==' ' || c=='\n')
        {
            c=getchar();
        }
        else if(c>='a' && c<='z')
        {  
            c=getchar();

            if(c==' ')
            {
                words=words+1;
                c=getchar();
            }
            else
            {
               c=getchar();
            }
        }
    }
    printf("%i\n",words);
}

4 个答案:

答案 0 :(得分:2)

诀窍是计算边界。

您的原始代码存在错误...

        if(c==' ')
        {
            words=words+1;
            c=getchar();
        }

如果一对读取产生'a' =&gt;,则代码仅计算单词。 'z'后跟' '

诀窍是在一个时间循环中将循环简化为读取一个字符。 (这确保不会发生奇怪的边界),以及模拟您是在吃单词还是空格的状态机。

enum Mode { word = 1, spaces = 2 };
int c=getchar();
enum Mode currentMode = spaces;
int words=0;

while(c!=EOF)
{
    if(c==' ' || c=='\n')
    {
        if( currentMode == word ) {
            words=words+1;
        }
        currentMode = spaces;
    }
    else if(c>='a' && c<='z')
    {  
        currentMode = word;
    }
c=getchar();
}
// count the last word...
if( currentMode == word ) {
    words=words+1;
}

代码现在将忽略任何非字母字符,既不是单词,也不是空格。

编辑:修正了错误的枚举使用

答案 1 :(得分:1)

您的代码存在的问题是您对getchar的分散调用,这些调用隐藏了您所看到的错误。

您需要检查每个字符是否为空格以及每个字符是否为字母的内容。

类似的东西:

while ((c = getchar()) != EOF) {
     if (c == ' ' || c == '\n') {

     } else if (c >= 'a' && c <= 'z')

     } else {

    }
}

现在你只需要弄清楚这些分组中的逻辑。你有正确的逻辑(如果前面的字母是一个字符,你得到一个空格,然后增加单词,否则只是继续)。但是,您对getchar的多次调用意味着您可以错过该条件。

填写上面的空白,它应该工作。 (然后用大写字母进行测试!)。

答案 2 :(得分:1)

您正在读取while循环中太多位置的字符。这是输出错误的原因。尝试使用此循环:

while(c!=EOF)
{
    while(c == ' ' || c == '\n') //consume multiple spaces
    {
        c = getchar();
    }

    for( int i=0 ;c >= 'a' && c <= 'z'; i++) //consuming a word
    {
        if(i == 0) //increment word count once at the start of each word
        {
            words++;
        }

        c = getchar();
    }

}

答案 3 :(得分:0)

您的代码存在

字符串问题
  

我认为偶数字符

程序的逻辑并不完全正常,你必须在最后else内添加这个条件:

 if(c==' ')
   {
     words=words+1;
     c=getchar();
   }

程序将是这样的:

  #include <stdio.h>

int main()
{
   int c=getchar();

    int words=0;

    while(c!=EOF)
    {
        if(c==' ' || c=='\n')
        {
            c=getchar();
        }
        else if(c>='a' && c<='z')
        {  
            c=getchar();
            if(c==' ')
            {
                words=words+1;
                c=getchar();
            }
            else
            {
               c=getchar();
               if(c==' ')
                {
                words=words+1;
                c=getchar();
                }
            }
        }
    }
    printf("%d\n",words);
    return 0;
}

因为当您输入两个字符的字符串并添加空格时,最后一个空格将由getchar语句中的最后else读取,而content = db.StringProperty(multiline=True) content2 = db.StringProperty(multiline=True) 语句不会增加单词的数量。

检查this results

我希望这有帮助!