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

C語言統計字串單詞數:兩種演算法實現與邊界處理

     編輯:關於C

問題定義

輸入字串,單詞以空格分隔,統計單詞個數。例:「how are you」→ 3。

方法一:狀態機跳躍法

#include <stdio.h>
#include <string.h>
#define SIZE 1024

int main() {
    char str[SIZE] = {0};
    int count = 0;
    printf("輸入字串: ");
    fgets(str, SIZE, stdin);  // 安全替代 gets
    str[strcspn(str, "\n")] = 0;  // 移除換行

    int len = strlen(str);
    for (int i = 0; i < len; i++) {
        if (str[i] != ' ') {          // 進入單詞
            count++;
            while (i < len && str[i] != ' ') i++;  // 跳過整個單詞
        }
    }
    printf("單詞數: %d\n", count);
    return 0;
}

邏輯: 遇到非空格 → 計數 +1 → 內層迴圈跳過連續非空格 → 外層迴圈繼續掃描。

方法二:旗標狀態機法

int main() {
    char str[SIZE] = {0};
    int count = 0, in_word = 0;
    fgets(str, SIZE, stdin);
    str[strcspn(str, "\n")] = 0;

    for (int i = 0; str[i]; i++) {
        if (str[i] == ' ') {
            in_word = 0;              // 離開單詞
        } else if (!in_word) {        // 進入新單詞
            count++; in_word = 1;
        }
    }
    printf("單詞數: %d\n", count);
    return 0;
}

邏輯: in_word 標記是否在單詞內。空格重置旗標,非空格且旗標為 0 時計數並置旗標。

對比與邊界處理

場景方法一方法二
前導空格正確正確
尾隨空格正確正確
多重空格正確正確
空字串00
單詞含製表符視為分隔符視為分隔符

增強版:支援多種空白字元

#include <ctype.h>
// 將 str[i] == ' ' 改為 isspace((unsigned char)str[i])
// 涵蓋空格、製表符、換行、垂直製表、換頁、回車

效能分析

  • 時間複雜度:O(n) 單次掃描
  • 空間複雜度:O(1) 常數額外空間
  • 方法二分支預測更友善(無內層迴圈),實際略快
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved