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

OJ 題目解析:統計元音字母出現次數

     編輯:關於C

題目需求

  • 輸入整數 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;
}

關鍵點解析

  1. 大小寫統一:使用 tolower 將字元轉為小寫後再比對,避免重複判斷 'a'||'A'。
  2. switch 效率高:編譯器常優化為跳躍表,比多重 if-else 更快且碼乾淨。
  3. 陣列對應輸出順序:cnt[0..4] 固定對應 a e i o u,輸出時直接按序列印,不易出錯。
  4. 空行控制:printf("\n\n") 產生兩個換行,即一個空行。僅在 n > 0(還有後續案例)時輸出,滿足「最後無空行」要求。
  5. 安全讀取:同前題,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 被誤統計(雖非元音無害,但屬邏輯瑕疵)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved