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

C語言字符串處理練習:單詞長度統計(跳過多空格、句號結尾)

     編輯:關於C語言

C語言字符串處理練習:單詞長度統計(跳過多空格、句號結尾)

經典字符串處理題:讀入一行以句號結尾的文本,單詞間可能有多個空格,輸出每個單詞長度(含標點符號),長度間單空格分隔,行末無空格。

一、題目需求分析

  • 輸入:一行文本,以 '.' 結尾。句號不計入最後單詞長度。
  • 單詞定義:由空格分隔的字符序列,**包含標點符號**(如 "it's" 長度 4)。
  • 輸出:每個單詞長度,空格分隔,末尾無空格換行。
  • 難點:連續空格跳過、句號作為終止符處理、首個輸出無前導空格。

二、算法邏輯

  1. 讀取整行 (gets 或 fgets)。
  2. 遍歷字符,維護 count 計數當前單詞長度。
  3. 遇到空格或句號:
    • 若 count > 0:輸出長度 (首個無前導空格,後續前加空格),count=0。
    • 若為空格:跳過所有連續空格。
    • 若為句號:輸出換行,結束循環。
  4. 其他字符:count++,繼續遍歷。

三、參考代碼 (C99)


#include 
#define MAX_LEN 1000

int main() {
    char line[MAX_LEN];
    // 安全讀取一行 (fgets 保留 \n,gets 不安全已棄用)
    if (!fgets(line, MAX_LEN, stdin)) return 0;
    
    int count = 0;
    int first = 1; // 首個單詞標記
    
    for (int i = 0; line[i]; i++) {
        char c = line[i];
        
        if (c == ' ' || c == '.') {
            if (count > 0) { // 完成一個單詞
                if (first) {
                    printf("%d", count);
                    first = 0;
                } else {
                    printf(" %d", count);
                }
                count = 0;
            }
            if (c == '.') { // 句號結束
                printf("\n");
                break;
            }
            // 空格:外層循環會繼續,這裡不需額外跳過,
            // 因為下一輪遇到空格 count==0 不會輸出,自然跳過連續空格
        } else {
            count++; // 普通字符計數
        }
    }
    return 0;
}

四、關鍵點解析

點處理
讀取函數用 fgets 替代危險的 gets,指定緩衝區大小防溢出
連續空格遇到空格時 count==0 不輸出,循環自然跳過,無需額外 while
句號結束檢測到 '.' 且 count>0 輸出後,打印換行 break 退出
首個輸出無前導空格first 標記控制 printf 格式
單詞包含標點非空格、非句號字符均計入長度 (it's→4, hello!→6)

五、測試用例

輸入輸出說明
It's great to see you here.4 5 2 3 3 4基本用例
It's great.4 5多空格跳過
Hello world .5 5首尾空格忽略
a b c.1 1 1單字符單詞
.(空行換行)無單詞

六、進階變體思考

  1. 單詞分隔符擴展:制表符 \t、換行 \n、標點符號作為分隔符 → 用 strtok 或狀態機處理。
  2. 統計單詞頻率:哈希表/Trie 存儲單詞計數。
  3. 最長/最短單詞:遍歷時維護 max/min 長度及對應單詞副本。
  4. Unicode 支持:UTF-8 多字節字符長度計算需解碼 (mbrlen/ICU庫)。

七、常見錯誤避坑

  • 用 scanf("%s") 讀取:遇到空格停止,**無法讀取整行含空格文本**。
  • gets 無緩衝區保護,**嚴禁使用** (C11 已移除)。
  • 未處理連續空格導致輸出多餘 0 或空格。
  • 句號計入最後單詞長度 (題目要求不計入)。
  • 最後輸出多餘空格 (題目要求行末無空格)。

這道題考察字符串遍歷、狀態管理 (單詞內/外)、邊界條件 (首尾空格、句號)、輸出格式控制。掌握「單遍歷、計數器、標記位、即時輸出」模式,可解決大多數字符串分詞統計問題。

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