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

C語言經典入門:統計空白、製表、換行字元數量(K&R 風格演進與最佳實踐)

     編輯:關於C語言

題目來源

源自《C 程式設計語言》(K&R)第一章練習 1-8:編寫程式統計輸入中的空白、製表符、換行符數量。

版本演進與代碼對比

版本一:基礎計數器

#include <stdio.h>

int main(void) {
    int blanks = 0, tabs = 0, newlines = 0;
    int c;
    while ((c = getchar()) != EOF) {
        if (c == ' ') blanks++;
        if (c == '\t') tabs++;
        if (c == '\n') newlines++;
    }
    printf("Blanks: %d\nTabs: %d\nNewlines: %d\n", blanks, tabs, newlines);
    return 0;
}

版本二:處理檔案結尾無換行情況

#include <stdio.h>

int main(void) {
    int blanks = 0, tabs = 0, newlines = 0;
    int c, last = 0;
    while ((c = getchar()) != EOF) {
        if (c == ' ') blanks++;
        else if (c == '\t') tabs++;
        else if (c == '\n') newlines++;
        last = c;
    }
    if (last != '\n' && last != EOF) newlines++;  // 最後一行無換行補計
    printf("Blanks: %d\nTabs: %d\nNewlines: %d\n", blanks, tabs, newlines);
    return 0;
}

版本三:狀態機優化(單次分支)

#include <stdio.h>

int main(void) {
    int blanks = 0, tabs = 0, newlines = 0;
    int c;
    while ((c = getchar()) != EOF) {
        switch (c) {
            case ' ':  blanks++;   break;
            case '\t': tabs++;     break;
            case '\n': newlines++; break;
        }
    }
    printf("Blanks: %d\nTabs: %d\nNewlines: %d\n", blanks, tabs, newlines);
    return 0;
}

延伸練習:K&R 1-9 ~ 1-12

習號功能關鍵技巧
1-9複製輸入到輸出,連續空白壓縮為一個狀態變數 inspace
1-10將 \t \b \\ 顯式輸出putchar('\\') 雙重輸出
1-11改用 switch 實作 1-10default 分支處理一般字元
1-12每個單字單獨一行輸出狀態機 inword/inspace

工程啟示:命名、註釋、風格

「好的命名與註釋同等重要,甚至見名知意比註釋更有力。」

  • 變數名:blanks 優於 b,newlines 優於 nl
  • 縮進:統一 4 空格或 1 Tab,專案內保持一致
  • 註釋:解釋「為什麼」而非「做什麼」

現代 C 最佳實踐

// 使用 size_t 計數、stdbool.h、錯誤檢查
#include <stdio.h>
#include <stdbool.h>

int main(void) {
    size_t blanks = 0, tabs = 0, newlines = 0;
    int c;
    while ((c = getchar()) != EOF) {
        blanks   += (c == ' ');
        tabs     += (c == '\t');
        newlines += (c == '\n');
    }
    printf("Blanks: %zu\nTabs: %zu\nNewlines: %zu\n", blanks, tabs, newlines);
    return 0;
}

布林值自動轉 0/1 簡化計數,size_t 保證非負且足夠大。

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