如何无需编写52个case统计文本中大小写字母的数量及种类?
如何不用52个case统计大小写字母的数量(C++实现)
完全不用写52个case,利用ASCII码的规律就能轻松搞定,给你两种实用的实现思路:
思路1:直接用ASCII码作为数组索引
大小写字母在ASCII表中是连续的固定区间:
- 大写字母
A-Z对应ASCII值 65-90 - 小写字母
a-z对应ASCII值 97-122
我们可以定义一个覆盖所有ASCII可见字符的数组,直接用字符的ASCII值作为下标计数,代码示例:
#include <iostream> #include <cctype> // 用于判断是否为字母 #include <string> using namespace std; int main() { int count[128] = {0}; // 初始化所有计数为0 string input; getline(cin, input); // 读取整行输入文本 for (char c : input) { if (isalpha(c)) { // 先过滤非字母字符 count[(unsigned char)c]++; // 用ASCII值作为下标累加计数 } } // 输出大写字母统计结果 cout << "大写字母统计:" << endl; for (char c = 'A'; c <= 'Z'; ++c) { if (count[(unsigned char)c] > 0) { cout << c << ": " << count[(unsigned char)c] << endl; } } // 输出小写字母统计结果 cout << "\n小写字母统计:" << endl; for (char c = 'a'; c <= 'z'; ++c) { if (count[(unsigned char)c] > 0) { cout << c << ": " << count[(unsigned char)c] << endl; } } return 0; }
注:(unsigned char)c 是为了避免部分扩展ASCII字符出现负值下标问题,确保索引合法。
思路2:将字母映射到0-51的索引(更节省空间)
如果不想用128位的数组,可以把大写字母映射到0-25区间,小写字母映射到26-51区间,用一个52位的数组存储:
#include <iostream> #include <cctype> #include <string> using namespace std; int main() { int count[52] = {0}; string input; getline(cin, input); for (char c : input) { if (isupper(c)) { count[c - 'A']++; // 大写A对应0,B对应1...Z对应25 } else if (islower(c)) { count[26 + (c - 'a')]++; // 小写a对应26,b对应27...z对应51 } } // 输出大写统计 cout << "大写字母统计:" << endl; for (int i = 0; i < 26; ++i) { if (count[i] > 0) { cout << (char)('A' + i) << ": " << count[i] << endl; } } // 输出小写统计 cout << "\n小写字母统计:" << endl; for (int i = 26; i < 52; ++i) { if (count[i] > 0) { cout << (char)('a' + (i - 26)) << ": " << count[i] << endl; } } return 0; }
这个逻辑和你统计数字的思路完全一致——数字是通过 c - '0' 得到0-9的索引,字母则通过 c - 'A' 或 c - 'a' 得到对应区间的索引,全程不需要switch分支。
内容的提问来源于stack exchange,提问作者tensshhi
相关产品推荐
相关产品推荐

