我是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
我的问题是我如何处理“开头的空格”之间的“两个连续的空格”,以及“最后一次“输入。
答案 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;
}
谢谢