【C++练习】14.C++统计字符串中字母、数字、空格和其他字符的个数
·
目录
- C++统计字符串中各类字符数量的方法详解
-
- 方法一:使用标准库函数和循环
-
- 思考:
- 代码解析:
- 优点:
- 方法二:使用ASCII值比较
-
- 思考:
- 代码解析:
- 优点:
- 缺点:
- 方法三:使用STL算法
-
- 思考:
- 代码解析:
- 优点:
- 缺点:
- 方法四:使用switch语句
-
- 思考:
- 代码解析:
- 优点:
- 缺点:
- 综合比较
C++统计字符串中各类字符数量的方法详解
我将详细讲解上述四种方法的思考逻辑和代码含义,帮助你理解每种方法的实现原理和适用场景。
方法一:使用标准库函数和循环
思考:
这种方法利用了C++标准库中的字符分类函数,是最直接和可读性最好的方法。它逐个检查字符串中的每个字符,使用专门的函数来判断字符类型。
代码解析:
void countCharacters(const std::string &str) {
int letters = 0, digits = 0, spaces = 0, others = 0;
// 使用范围for循环遍历字符串中的每个字符
for (char ch : str) {
if (isalpha(ch)) { // 判断是否为字母
letters++;
} else if (isdigit(ch)) { // 判断是否为数字
digits++;
} else if (isspace(ch)) { // 判断是否为空白字符(包括空格、制表符等)
spaces++;
} else { // 其他字符
others++;
}
}
// 输出统计结果
std::cout << "字母: " << letters << "\n";
std::cout << "数字: " << digits << "\n";
std::cout << "空格: " << spaces << "\n";
std::cout << "其他: " << others << "\n";
}
优点:
- 代码简洁易读
- 使用标准库函数,可靠性高
- 可处理各种空白字符(不只是空格)
方法二:使用ASCII值比较
思考:
这种方法基于ASCII字符编码的特性,直接比较字符的ASCII值来判断类型。它不依赖标准库函数,而是使用基本的比较操作。
代码解析:
void countCharactersASCII(const std::string &str) {
int letters = 0, digits = 0, spaces = 0, others = 0;
for (char ch : str) {
// 大写字母A-Z或小写字母a-z
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
letters++;
}
// 数字0-9
else if (ch >= '0' && ch <= '9') {
digits++;
}
// 空格字符
else if (ch == ' ') {
spaces++;
}
// 其他字符
else {
others++;
}
}
std::cout << "字母: " << letters << "\n";
std::cout << "数字: " << digits << "\n";
std::cout << "空格: " << spaces << "\n";
std::cout << "其他: " << others << "\n";
}
优点:
- 不依赖标准库函数
- 执行效率可能略高(但现代编译器优化后差异不大)
- 明确展示了字符分类的逻辑
缺点:
- 只能检测空格字符(’ '),不包括其他空白字符
- 代码稍显冗长
方法三:使用STL算法
思考:
这种方法利用了C++标准模板库(STL)中的算法,特别是
"count_if"函数,配合lambda表达式来实现字符分类统计,体现了函数式编程的思想。
代码解析:
void countCharactersSTL(const std::string &str) {
// 使用count_if和lambda表达式统计字母数量
int letters = std::count_if(str.begin(), str.end(),
[](char c) { return isalpha(c); });
// 统计数字数量
int digits = std::count_if(str.begin(), str.end(),
[](char c) { return isdigit(c); });
// 统计空白字符数量
int spaces = std::count_if(str.begin(), str.end(),
[](char c) { return isspace(c); });
// 其他字符 = 总字符数 - 已知类型字符数
int others = str.size() - letters - digits - spaces;
std::cout << "字母: " << letters << "\n";
std::cout << "数字: " << digits << "\n";
std::cout << "空格: " << spaces << "\n";
std::cout << "其他: " << others << "\n";
}
优点:
- 代码简洁,利用了STL的强大功能
- 避免了显式循环,减少了出错可能
- 易于并行化处理(使用并行算法版本)
缺点:
- 需要遍历字符串三次(对于每个count_if)
- 对于初学者可能不如循环直观
方法四:使用switch语句
思考:
这种方法使用switch语句和case范围(GCC扩展)来实现字符分类,展示了另一种控制流结构的使用方式。
代码解析:
void countCharactersSwitch(const std::string &str) {
int letters = 0, digits = 0, spaces = 0, others = 0;
for (char ch : str) {
switch (ch) {
case '0'...'9': // GCC扩展,表示0到9的范围
digits++;
break;
case 'A'...'Z': // 大写字母范围
case 'a'...'z': // 小写字母范围
letters++;
break;
case ' ': // 空格字符
spaces++;
break;
default: // 其他字符
others++;
break;
}
}
std::cout << "字母: " << letters << "\n";
std::cout << "数字: " << digits << "\n";
std::cout << "空格: " << spaces << "\n";
std::cout << "其他: " << others << "\n";
}
优点:
- 使用switch语句,结构清晰
- 对于某些编译器可能生成高效的跳转表
缺点:
- case范围是GCC扩展,不是标准C++
- 只能检测空格字符(’ '),不包括其他空白字符
- 对于非连续范围的字符分类不太适用
综合比较
- 可读性:方法一 > 方法四 > 方法三 > 方法二
- 可移植性:方法一 = 方法三 > 方法二 > 方法四
- 灵活性:方法一 = 方法三 > 方法二 > 方法四
- 性能:实际差异不大,现代编译器都能很好优化
推荐:对于大多数情况,方法一是最佳选择,因为它结合了可读性、可移植性和灵活性。只有在有特殊需求(如不能使用标准库)时,才考虑其他方法。
更多推荐


所有评论(0)