C:计算单词数量(需要帮助修复)

时间:2013-04-20 02:40:34

标签: c string

我是C编程的新手,并尝试编写一个代码来计算字符串中的单词数。这是我的代码数量的代码。

    #include<stdio.h> 
    #include<string.h>
    void main() 
    { 
        int count=0,i,len; 
        char str[100]; 
        printf("enter the sentence"); 
        gets(str); 
        len=strlen(str); 
        for(i=0;i<=len;i++) 
        {  
           if(str[i]==' ') 
              count++; 
        } 
        printf("the number of words are :\t%d",count+1); 
    }

当我的输入为:Here is four words时,它可以正常工作。它给出了输出 the number of words are : 4

我的问题是我如何处理“开头的空格”之间的“两个连续的空格”,以及“最后一次“输入。

8 个答案:

答案 0 :(得分:3)

不是计算空格,而是计算每个单词的第一个非空格字符。

#include<stdio.h> 

int main() 
{ 
    int count=0; 
    char str[100]; 
    printf("enter the sentence"); 
    gets(str);

    char *cur= str;

    for (;;)
    {
        while (*cur == ' ')
        {
            cur++;
        }

        if (*cur == 0)
        {
            break;
        }

        count++;

        while (*cur != 0 && *cur != ' ')
        {
            cur++;
        }
    }

    printf("the number of words are :\t%d",count); 

    return 0;
}

答案 1 :(得分:0)

您可以使用:

 while(str[i]==' '&&str[i]!=EOF) 
{
    count++;
    i++;
}

而不是你的if部分。您还需要在for循环之前添加这些代码以读取开始空格。

答案 2 :(得分:0)

我认为当前形式的循环可能无法正常运行,

应该如下,

    for(i=0;i<len;i++) 
    { 
          if(i!=0)
          {
             if(str[i]==' ') 
               count++; 
          }
    }  

要检查其他条件,请按以下方式更改代码,

    for(i=0;i<len;i++) 
    { 
             if(str[i]==' ') 
             {  
                if(i!=0)
                {  
                   if(str[i+1]!=' ')
                   {
                      count++;
                   } 
               }   
    }  

答案 3 :(得分:0)

只是忽略开头的空格和其他空格后的空格,如果最后没有空格,则忽略+1。

#include <stdio.h> 
#include <string.h>
// #include <stdlib.h>
int main() // void main is a bad practice
{ 
    int count = 0, i, len, ignoreSpace; 
    char str[100];
    printf("enter the sentence\n"); 
    gets(str); 
    len = strlen(str); 
    ignoreSpace = 1; // handle space at the beginning
    for(i = 0; i < len; i++) // not i<=len
    { 
        if(str[i] == ' '){
            if(!ignoreSpace){
                count++;
                ignoreSpace = 1; // handle two or more consecutive spaces
            }
        }else{
            ignoreSpace = 0;
        }
    }
    if( !ignoreSpace ) // handle space at the last
        count++;
    printf("the number of words are :\t%d\n", count); // +1 is moved to previous line
    // system("pause");
    return 0;
}

答案 4 :(得分:0)

您应该计算从空间到非空格字符的转换+开头本身可能的非空格字符。

#include<stdio.h> 
#include<string.h>
int main() 
{ 
    int count=0,i,len, cur_is_spc; 
    char str[100]; 
    printf("enter the sentence"); 
    gets(str); 
    len=strlen(str);

    cur_is_spc = 0;           // 0, if current character is not space. 1, if it is.

    for(i=0; str[i]!='\0'; i++) 
    { 
       if(str[i] != ' ')
       {
           switch(cur_is_spc) // currently holding value for previous character
           {
           case 0: count++; break;    //count the spc->non-spc transitions
           case 1:          break;
           default: cout << "Erroneous value"; exit(1);
           }
           cur_is_spc = 1;    //updated for current character.
       }
       else
       {
           cur_is_spc = 0;    //updated for current character.
       }
    } 

    printf("the number of words are :\t%d",count+1); 
    return 0;
}

在这里,我只检查空格。但是可以有换行符,制表符等字符。你的代码如何处理它们?提示:使用isspace()函数。

/此外,如果您确定单词仅由字母组成,则可以从非字母字符到字母字符进行转换。这种方法具有内在的灵活性,可以满足您的需求。

答案 5 :(得分:0)

为什么不使用strtok并完全绕过它:

int main()
{
    int num_words = 0;
    char    str_one[] = "This string has a trailing space ";
    char    str_two[] = " This string has a preceeding space";
    char    str_three[] = "This string contains  two spaces consecutively  twice!";
    char    delim[] = " ";
    char    *ret;

    /* fgets() for user input as desired... */

    if (( ret = strtok(str_one, delim)) != NULL )
    {
        while ( ret )
        {
            num_words++;
            ret = strtok(NULL, delim);
        }
    }
    else
    {
        /* no spaces, but might contain a word if the string isn't empty */
        if ( str_one[0] != '\0' )
            num_words = 1;
    }

    printf("str_one contains %i words\n", num_words);
    num_words = 0;

    ...

    return 0;
}

顺便说一句:主要应该 总是 返回!!!

答案 6 :(得分:0)

使用strtok并首次调用strtok使用strtok(字符串,“”),其余调用使用strtok(NULL,“\ n”)

答案 7 :(得分:0)



一个快速的方法是使用strtok并根据谓词打破一切。此功能可满足您的所有要求。

#include<stdio.h>
#include<string.h>
int countSpace(char* str){
int counter = 0;
char * newString;
newString= strtok (str, " "); // now the newString has the str except first word
while (newString != NULL){
    counter++; // Put counter here to ignore the newString == NULL 
                // Or just -1 from the counter on main()
    newString= strtok (NULL, " "); //Break the str in to words seperated by spaces

}
return counter;
}
void main(){
    int count=0,i,len;
    char str[100];
    printf("Enter the sentence:\n");
    fgets (str , 100 , stdin);
    count = countSpace(str);
    printf("The number of words are :\t%d\n",count);
    return 0;
}

谢谢