【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】
在面試環節中,有一道題目也是考官們中意的一道題目:如果統計一段由字元和和空格組成的字串中有多少個單詞?
其實,之所以問這個題目,考官的目的就是想瞭解一下你對狀態機器瞭解多少。
(1) 題目分析
從題目上看,如果對一個字串進行處理,那麼可以有下面幾種情形:初始狀態,字元狀態,空格狀態,結束狀態。那麼這幾種狀態之間應該怎麼遷移呢?
初始狀態: 如果輸入符號是空格,那麼進入空格狀態;如果是字元,那麼就進入字元狀態,同時單詞個數+1;如果是結束狀態,那麼直接返回;
字元狀態:如果輸入符號是空格,那麼進入空格狀態;如果是字元,那麼什麼也不做;如果是結束,直接返回;
空格狀態:如果輸入符號是空格,那麼什麼也不做;如果是字元,那麼進入字元狀態,同時單詞個數+1;如果結束狀態,那麼直接返回。
/* 輸入是字元* --------> 字元狀態 ----------* | | -->* 初始狀態 輸入字元 | | 輸入空格 結束狀態* | -->* ---------> 空格狀態 ----------|* 輸入是空格*/
(2)根據上面描述的狀態遷移過程,編寫對應的代碼
typedef enum{INIT_STATE = 1,WORD_STATE,SPACE_STATE,};int count_word_number(const char* pStr){int count = 0;int state = INIT_STATE;char value ;if(NULL == pStr)return 0;while(value = *pStr++){switch (state){case INIT_STATE:if(' ' != value)count ++, state = WORD_STATE;elsestate = SPACE_STATE;break;case WORD_STATE:if(' ' == value)state = SPACE_STATE;else if('\0' == *pStr)return count;break;case SPACE_STATE:if(' ' != value)count ++, state = WORD_STATE;else if('\0' == *pStr)return count;break;default:break;}}return count;}
(3)編寫測試案例,驗證代碼是否編寫正確
void test(){assert(0 == count_word_number(NULL));assert(0 == count_word_number(""));assert(1 == count_word_number("hello"));assert(3 == count_word_number("china baby hello"));}
總結:
1)狀態機器是編程人員的基本功,它和另外一種方法回呼函數註冊一樣,使我們在日常開發中經常用到的一種方法
2)狀態機器是電腦網路通訊的重要內容,想要對tcp-ip協議棧加深瞭解的朋友尤其需要重點掌握