感觉没有这么复杂吧。
从第一个字符开始判断,如果是空格,接着往下找,直到不是空格后开始是第一个单词的开始,知道再次读到空格后第一个单词结束,单词个数加1,在继续往下找,直到不是空格后另一个单词的开始,直到再次读到空格后另一个单词结束,如此循环下去,直到读到了字符串的末尾,不管字符串的末尾有没有空格,都是一个单词,单词个数都加1.
好像这样就可以了,比较容易实现。
第一种方法写起来简单:
#include
#include
#include
enum STATE
{
ST_WORD,
ST_END,
};
int counta()
{
FILE *fp = stdin;
int ch;
enum STATE st = ST_END;
int count = 0;
do
{
ch = fgetc(fp);
switch(st)
{
case ST_WORD:
if( ch=='\n' || ch==EOF )
{
count++;
ch = EOF;
}
else if( ch==' ' )
{
count++;
st = ST_END;
}
break;
case ST_END:
if( ch=='\n' || ch==EOF )
ch = EOF;
else if( ch!=' ' )
st = ST_WORD;
break;
}
}while(ch!=EOF);
printf("count=%d\n", count);
return 0;
}
int main(int argc, char *argv[])
{
counta();
return 0;
}
C#中,有string.Split()方法,可以空格为分隔符拆成数组(有参数可去掉空的,即连续空格),直接读此方法返回的数组的长度即可。如:
return “abcdef @#$% 1A2B x>y *****”.Split(" ", StringSplitOptions.RemoveEmptyEntries).Length;
不知道C中有没有此类函数。