入门 · cctype

数元音

读入一个单词,统计元音个数。判题故意放了全大写输入 —— 这就是这道题的功课。

一句话答案遍历字符串,把每个字符和大小写的 a、e、i、o、u 各比一次 —— 隐藏用例里有全大写输入,只判小写会漏数。

题目

输入: 一个单词(只含字母,可能全大写)。

输出: 元音数量,不区分大小写。

样例:

输入输出
AEIOU5

你的解答

main.cpp — 你的解答
「运行我的输入」用的自定义输入

判题在浏览器本地运行。死循环会在 3 秒后被自动中断 —— 但还是确保每个循环都有出口。代码随打随存。

卡住了?提示

提示 1 — tolower 是好朋友

<cctype> 里的 char c = tolower(s[i]);,再和五个小写元音比较。

提示 2 — 循环条件

for (int i = 0; s[i] != '\0'; i++) —— 遇到终止符就停,不用固定长度。

题解(先自己试试!)
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;

int main() {
    char s[100];
    cin >> s;
    int count = 0;
    for (int i = 0; s[i] != '\0'; i++) {
        char lower = tolower(s[i]);
        if (lower == 'a' || lower == 'e' || lower == 'i' ||
            lower == 'o' || lower == 'u') count++;
    }
    cout << count << endl;
    return 0;
}

不用 tolower,测试 AEIOU 会返回 0。下一题:二维数组。

深度解析

为什么这样做对

按「是否属于某个集合」做分类,是你以后遇到的每一个词法分析器和语法分析器的第一块砖。

代价

O(n·k),k = 5 次比较,也就是 O(n)。用 256 项查表可以把 k 变成常数。

常见错法

  • 只数小写会漏掉 'A'。统一 tolower,或者大小写都判。
  • tolower 受区域设置影响:土耳其语区域里 'I' 不会变成 'i'。

下一步

字符数组的规模用法:反转字符串。

记住这两句

  • 比较字符前先统一大小写。
  • 判断「属不属于」要用查表,不是一串 if。
🐞 这段是错的 —— 点开,亲手让它挂一次

只数了小写元音,大写全漏

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char s[100];
    cin >> s;
    int n = strlen(s), c = 0;
    for (int i = 0; i < n; i++) {
        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u') c++;
    }
    cout << c << endl;
    return 0;
}