經典 C 語言基礎練習:讀取一行輸入(以換行符結束),分類統計 0-9、a-z、A-Z、空格、其他字符的出現次數。本文提供規範代碼、邏輯解析、輸出格式化技巧。
#includeint main() { int digit[10] = {0}, lower[26] = {0}, upper[26] = {0}; int space = 0, other = 0; int ch; printf("請輸入一行字符(回車結束):\n"); while ((ch = getchar()) != '\n' && ch != EOF) { if (ch >= '0' && ch <= '9') digit[ch - '0']++; else if (ch >= 'a' && ch <= 'z') lower[ch - 'a']++; else if (ch >= 'A' && ch <= 'Z') upper[ch - 'A']++; else if (ch == ' ') space++; else other++; } // 格式化輸出:每行 3 項 auto print_arr = [](const char *label, int *arr, int n, int base) { printf("\n%s:\n", label); for (int i = 0; i < n; i++) { printf(" '%c':%-4d", base + i, arr[i]); if ((i+1) % 3 == 0) printf("\n"); } if (n % 3) printf("\n"); }; // C99 不支持 lambda,實際用函數或宏展開 printf("\n數字統計:"); for (int i=0;i<10;i++) { printf(" %d:%d", i, digit[i]); if((i+1)%3==0) printf("\n"); } printf("\n小寫字母統計:"); for (int i=0;i<26;i++) { printf(" %c:%d", 'a'+i, lower[i]); if((i+1)%3==0) printf("\n"); } printf("\n大寫字母統計:"); for (int i=0;i<26;i++) { printf(" %c:%d", 'A'+i, upper[i]); if((i+1)%3==0) printf("\n"); } printf("\n空格數: %d\n其他字符數: %d\n", space, other); return 0; }
'0'-'9'、'a'-'z'、'A'-'Z',通過 ch - '0' 映射數組下標,O(1) 分類。getchar() 逐字符讀取,遇 '\n' 或 EOF 終止,避免 scanf 格式化掃描跳過空白字符的問題。int arr[N] = {0}; 靜態初始化全零,避免未定義行為。ctype.h 標準庫函數#includeif (isdigit(ch)) digit[ch-'0']++; else if (islower(ch)) lower[ch-'a']++; else if (isupper(ch)) upper[ch-'A']++; else if (isspace(ch)) space++; else other++;
優勢:與 Locale 相關,支持非 ASCII 字符集(如 UTF-8 多字節需配合 mbrtowc)。
FILE *fp = fopen("text.txt", "r");
int ch;
while ((ch = fgetc(fp)) != EOF) { /* 同分類邏輯 */ }
fclose(fp);