源自《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;
}
| 習號 | 功能 | 關鍵技巧 |
|---|---|---|
| 1-9 | 複製輸入到輸出,連續空白壓縮為一個 | 狀態變數 inspace |
| 1-10 | 將 \t \b \\ 顯式輸出 | putchar('\\') 雙重輸出 |
| 1-11 | 改用 switch 實作 1-10 | default 分支處理一般字元 |
| 1-12 | 每個單字單獨一行輸出 | 狀態機 inword/inspace |
「好的命名與註釋同等重要,甚至見名知意比註釋更有力。」
blanks 優於 b,newlines 優於 nl// 使用 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 保證非負且足夠大。