題目需求
- 輸入整數
n,後續 n 行字串(長度 ≤ 100)。
- 對每行統計
a, e, i, o, u(不分大小寫)出現次數。
- 輸出格式固定:
a:num、e:num、i:num、o:num、u:num,每佔一行。
- 測試案例間以一個空行分隔,最後一組無尾隨空行。
完整解法
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
int n;
char line[101];
if (scanf("%d", &n) != 1) return 0;
getchar(); // 吸收換行
while (n--) {
fgets(line, sizeof(line), stdin);
size_t len = strlen(line);
if (len > 0 && line[len - 1] == '\n')
line[--len] = '\0';
int cnt[5] = {0}; // a, e, i, o, u
for (size_t i = 0; i < len; i++) {
char c = tolower((unsigned char)line[i]);
switch (c) {
case 'a': cnt[0]++; break;
case 'e': cnt[1]++; break;
case 'i': cnt[2]++; break;
case 'o': cnt[3]++; break;
case 'u': cnt[4]++; break;
}
}
printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d",
cnt[0], cnt[1], cnt[2], cnt[3], cnt[4]);
if (n > 0) printf("\n\n"); // 案例間雙換行 = 一空行
}
return 0;
}
關鍵點解析
- 大小寫統一:使用
tolower 將字元轉為小寫後再比對,避免重複判斷 'a'||'A'。
switch 效率高:編譯器常優化為跳躍表,比多重 if-else 更快且碼乾淨。
- 陣列對應輸出順序:
cnt[0..4] 固定對應 a e i o u,輸出時直接按序列印,不易出錯。
- 空行控制:
printf("\n\n") 產生兩個換行,即一個空行。僅在 n > 0(還有後續案例)時輸出,滿足「最後無空行」要求。
- 安全讀取:同前題,
fgets + 移除 \n 是標準作法。
樣本驗證
輸入:
2
aeiou
my name is ignatius
輸出:
a:1
e:1
i:1
o:1
u:1
a:2
e:1
i:3
o:0
u:1
常見錯誤
- 忘記大小寫不敏感 → 大寫元音漏統計。
- 最後一組多輸出空行 → Presentation Error。
- 使用
scanf("%s") → 遇空格截斷,無法處理含空格字串(如樣本第二行)。
- 未移除
fgets 的 \n → \n 被誤統計(雖非元音無害,但屬邏輯瑕疵)。