使用状态机解决问题,主要有两个步骤:
1、确定系统总共有几个状态
2、确定状态之间的迁移过程
对于统计字符串来说,总共有四种状态:初始状态、单词状态、空格状态、结束状态
四种状态之间的迁移如下:
初始状态:如果输入是字符,那么进入单词状态,同时单词个数加一;如果是空格,则进入空格状态
单词状态:如果输入是字符,那么什么也不做;如果是空格,则进入空格状态
空格状态:如果输入是字符,则进入单词状态,同时单词个数加一;如果是空格,则什么也不做
typedef enum{
STATE_INIT,
STATE_WORD,
STATE_SPACE,
STATE_END
}STATE;
#include <stdio.h>
#include <ctype.h>
unsigned int CountWord(const char *_pstr)
{
STATE currentState = STATE_INIT;
unsigned int count = 0;
char value;
if(NULL == _pstr){
return 0;
}
while(value = *_pstr++){
switch (currentState) {
case STATE_WORD:
if(isspace(value)){
currentState = STATE_SPACE;
}
break;
case STATE_SPACE:
if(isspace(value)){
//currentState = STATE_SPACE;
}else{
currentState = STATE_WORD;
++count;
}
break;
case STATE_INIT:
if(isspace(value)){
currentState = STATE_SPACE;
}else{
currentState = STATE_WORD;
++count;
}
break;
default:
break;
}
}
return count;
}
int main(void)
{
printf("%d\n", CountWord(""));
printf("%d\n", CountWord("Hello World"));
printf("%d\n", CountWord("My name is XXX"));
return 0;
}
注:代码中没有判断标点符号,如果需要,可以在条件中添加