單詞統計是字符處理基礎問題。本文對比譚浩強教材經典解法與擴展版本,展示狀態機思想在文本處理中的應用。
int num = 0, word = 0;
char c;
gets(string);
for (i = 0; (c = string[i]) != '\0'; i++) {
if (c == ' ') word = 0; // 空格:非單詞狀態
else if (word == 0) { // 非空格且前為空格
word = 1; // 進入單詞狀態
num++; // 計數
}
}
核心:word 變量標記「是否在單詞內」,遇非空格且前為空格時計數。
bool isLetter(char x) {
return (x >= 'A' && x <= 'Z') || (x >= 'a' && x <= 'z');
}
for (i = 0; i < 100; i++) {
if (string[i+1] == '\0') { // 末尾處理
if (isLetter(string[i])) num++;
break;
}
// 單詞結束條件:當前是字母,下一個非字母
if (isLetter(string[i]) && !isLetter(string[i+1]))
num++;
}
| 維度 | 原版 | 擴展版 |
|---|---|---|
| 分隔符 | 僅空格 | 所有非字母字符 |
| 標點處理 | 計入單詞 | 作為分隔符 |
| 邏輯核心 | 狀態機 | 邊界檢測 |
| 適用場景 | 簡單空格分隔文本 | 自然語言文本 |
兩種本質都是有限狀態自動機:
理解狀態機模型,可輕鬆擴展至詞法分析、协议解析等複雜場景。