首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言統計單詞數:修正邏輯錯誤與編碼陷阱

     編輯:程式設計綜合問答

原代碼存在的三大致命問題

  1. 賦值誤寫為比較:if(c[i]='\0') 應為 if(c[i]=='\0')。單一等號導致字串提前截斷,邏輯全亂。
  2. 循環變量 i 重複遞增:for 迴圈自帶 i++,迴圈體內再寫 i++ 會跳過字符。
  3. 首字母檢測邏輯多餘且錯誤:第一個 for 試圖跳過非字母,但單詞分隔符是空格,非字母不代表單詞邊界(如標點、數字)。

正確思路:狀態機法(標準解法)

掃描字串,維護「是否在單詞內」狀態,遇到空格且前狀態為在單詞內,計數器加一。

修正後完整代碼

#include <stdio.h>
#include <ctype.h>  // for isspace()

int main() {
    char str[1000];
    int count = 0;
    int in_word = 0;  // 0: 不在單詞中, 1: 在單詞中

    printf("請輸入一行文字:");
    fgets(str, sizeof(str), stdin);  // 安全替代 gets()

    for (int i = 0; str[i] != '\0'; i++) {
        if (isspace((unsigned char)str[i])) {  // 遇到空白字符(空格、制表、換行等)
            if (in_word) {
                count++;
                in_word = 0;
            }
        } else {
            in_word = 1;  // 非空白字符,進入/持續單詞狀態
        }
    }
    // 處理行末無空格直接結束的情況
    if (in_word) count++;

    printf("單詞數量:%d\n", count);
    return 0;
}

關鍵改進點

  • 使用 fgets 替代危險的 gets(已從 C11 標準移除)。
  • isspace() 涵蓋所有空白字符,比單判空格更健壯。
  • 狀態機邏輯清晰,時間複雜度 O(n),空間 O(1)。
  • 正確處理行尾單詞、多連續空格、前導空格等邊界情況。

進階擴展

  • 若單詞定義為「僅字母組成」:在 else 分支加入 isalpha() 判斷,非字母視為分隔符。
  • 統計單詞長度、最長單詞:在狀態機中記錄當前單詞起始位置。
  • 大文件處理:逐塊讀取,跨塊邊界保持狀態。

拒絕硬編碼索引操作,用狀態機思維寫出健壯、可維護的字串處理代碼。

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