计算一个字符串的单词

时间:2017-05-28 13:29:55

标签: c string algorithm count

正如标题所述,我必须添加一些东西来解释:" "/tab/","/"."是在我的情况下划分单词的东西,另一个说明可能会有更多的单个空格或点一个接一个地出现

这就是我所拥有的

int countWords(char * str, int length){
       int counter = 0;

        for( int i = 0; i < length; i++){
            if(( str[i] == " ") || ( str[i] == ".") || ( str[i] == ",")){
                if(( str[i+1] != " ") || ( str[i+1] != ".") || (str[i+1] != ",")){
                    if(( str[i-1] != " ") || ( str[i-1] != ".") || (str[i-1] != ","))
                        counter++;
                }
            }
        }
        return counter;
    }

我收到一个错误,说我无法比较int和指针,我确实知道它来自何处,但我怎样才能让它实际工作?

注意*我无法使用string.h

2 个答案:

答案 0 :(得分:1)

在这样的表达中

str[i] == " "
          ^^^

您正在尝试将类型为char的对象与隐式转换为char *类型的字符串文字进行比较。

您必须使用字符常量而不是字符串文字

str[i] == ' '
          ^^^

封闭的if语句没有意义。例如,对于i等于0,表达式str[i-1]尝试访问字符串之外的内存。

应该使用限定符const声明函数的第一个参数。

该功能可以按照以下方式显示,如演示程序中所示。

#include <stdio.h>

size_t countWords( const char *s ) 
{
    size_t n = 0;

    for (size_t i = 0; s[i] != '\0'; )
    {
        while (s[i] == ' '  || 
               s[i] == '\t' || 
               s[i] == '.'  || 
               s[i] == ',') ++i;

        if (s[i] != '\0')
        {
            ++n;
            while ( s[i] != '\0' &&
                    ! ( s[i] == ' '  ||
                        s[i] == '\t' ||
                        s[i] == '.'  ||
                        s[i] == ',')) ++i;

        }
    }

    return n;
}

int main( void )
{
    char *s = "  Hello\t, World...";

    printf("%zu\n", countWords(s));
}

程序输出

2

或者函数的实现看起来像

size_t countWords(const char *s)
{
    size_t n = 0;

    while ( *s )
    {
        while (*s == ' '  ||
               *s == '\t' ||
               *s == '.'  ||
               *s == ',') ++s;

        if ( *s )
        {
            ++n;
            while ( *s &&
                    !( *s == ' '  ||
                       *s == '\t' ||
                       *s == '.'  ||
                       *s == ',' ) ) ++s;

        }
    }

    return n;
}

声明该功能的更一般方法如下

size_t countWords( const char *s1, const char *s2 );

其中字符串s2指定一组单词分隔符。

答案 1 :(得分:0)

如果你想数字,K&amp; R ANSI C就有一个很好的例子。尝试编写这样的程序。

#include <stdio.h>
#define IN  1    /* inside a word */
#define OUT 0    /* outside a word */
/* count lines, words, and characters in input */
main()
{
   int c, nl, nw, nc, state;
   state = OUT;
   nl = nw = nc = 0;
   while ((c = getchar()) != EOF)
 {
    ++nc;
    if (c == '\n')
        ++nl;
    if (c == ' ' || c == '\n' || c = '\t')
        state = OUT;
    else if (state == OUT) 
    {
        state = IN;
        ++nw;
     }
   }
printf("%d %d %d\n", nl, nw, nc);
}

希望这会有所帮助。 :)您可以找到本书here的pdf。