首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言單詞統計:從譚浩強經典例題到標點擴展版

     編輯:關於C語言

C語言統計行中單詞數:經典狀態機與擴展算法

單詞統計是字符處理基礎問題。本文對比譚浩強教材經典解法與擴展版本,展示狀態機思想在文本處理中的應用。

原版邏輯:空格分隔狀態機


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++;
}

算法對比

維度原版擴展版
分隔符僅空格所有非字母字符
標點處理計入單詞作為分隔符
邏輯核心狀態機邊界檢測
適用場景簡單空格分隔文本自然語言文本

狀態機思想總結

兩種本質都是有限狀態自動機:

  • 原版:兩狀態(IN_WORD, OUT_WORD),空格驅動轉換
  • 擴展版:隱含狀態,字母/非字母邊界驅動計數

理解狀態機模型,可輕鬆擴展至詞法分析、协议解析等複雜場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved