入门 · cctype
数元音
读入一个单词,统计元音个数。判题故意放了全大写输入 —— 这就是这道题的功课。
一句话答案遍历字符串,把每个字符和大小写的 a、e、i、o、u 各比一次 —— 隐藏用例里有全大写输入,只判小写会漏数。
题目
输入: 一个单词(只含字母,可能全大写)。
输出: 元音数量,不区分大小写。
样例:
| 输入 | 输出 |
|---|---|
AEIOU | 5 |
你的解答
「运行我的输入」用的自定义输入
判题在浏览器本地运行。死循环会在 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;
}