0

我是 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

我的问题是如何处理单词之间的“两个连续空格”,输入的“开头的空格”和输入的“最后的空格” 。

4

8 回答 8

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;
}
于 2013-04-20T03:54:45.133 回答
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;
}

谢谢

于 2013-04-20T03:53:41.740 回答
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;
}
于 2013-04-20T02:56:24.890 回答
0

您可以使用:

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

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

于 2013-04-20T02:48:42.673 回答
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++;
                   } 
               }   
    }  
于 2013-04-20T02:48:55.873 回答
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() 函数。

/此外,如果您决定单词仅由字母组成,则可以从非字母字符转换为字母字符。这种方法本质上是灵活的,可以满足您的需求。

于 2013-04-20T03:08:48.753 回答
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;
}

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

于 2013-04-20T03:12:09.060 回答
0

使用 strtok 和第一次调用 strtok 使用 strtok(string," ") 其余调用使用 strtok(NULL, " \n")

于 2013-04-20T03:19:28.237 回答