在C++中如何拆分文本中相邻的字母和数字字符?
C++ 字母数字混合串拆分实现
实现逻辑
你需要拆分的字符串规则是「连续大写字母块 + 连续数字块」循环拼接,核心逻辑如下:
- 遍历字符串时实时判断当前字符类型(字母/数字)
- 当字符类型发生切换时,将前一段同类型的连续字符作为独立块存储
- 字母块统一转换为首字母大写、其余字符小写的格式,数字块保留原有内容
- 每一组「字母块+数字块」按要求的格式拼接输出即可
完整可运行代码
#include <iostream> #include <string> #include <cctype> #include <vector> #include <utility> int main() { // 示例输入,实际使用时可替换为文件读取逻辑 std::string raw_str = "JACK1940383DAVID30284HAROLD68372TROY4392"; std::vector<std::pair<std::string, std::string>> result; if (raw_str.empty()) { std::cout << "输入为空" << std::endl; return 0; } std::string current_block; bool is_current_alpha = isalpha(raw_str[0]); current_block += raw_str[0]; for (size_t i = 1; i < raw_str.size(); ++i) { bool is_now_alpha = isalpha(raw_str[i]); if (is_now_alpha != is_current_alpha) { // 字符类型切换,处理前一个块 if (is_current_alpha) { // 处理字母块:转换为首字母大写其余小写的格式 std::string formatted_name; formatted_name += toupper(current_block[0]); for (size_t j = 1; j < current_block.size(); ++j) { formatted_name += tolower(current_block[j]); } result.emplace_back(formatted_name, ""); } else { // 处理数字块:直接存入对应组的第二个字段 result.back().second = current_block; } // 重置当前块状态 current_block.clear(); is_current_alpha = is_now_alpha; } current_block += raw_str[i]; } // 处理遍历结束后剩余的最后一个块 if (!current_block.empty() && !is_current_alpha) { result.back().second = current_block; } // 按要求格式输出 std::cout << "List: "; for (size_t i = 0; i < result.size(); ++i) { if (i != 0) { std::cout << ", "; } std::cout << result[i].first << " / " << result[i].second; } std::cout << std::endl; return 0; }
代码说明
- 运行示例输入的输出结果为
List: Jack / 1940383, David / 30284, Harold / 68372, Troy / 4392,完全符合要求 - 仅依赖C标准库,兼容C11及以上版本,无需额外安装依赖
- 逐字符遍历的逻辑支持大文件处理,不需要一次性加载整个文件到内存
- 可自行补充异常处理逻辑,应对输入格式不符合「字母+数字循环」的场景
内容的提问来源于stack exchange,提问作者remaux
相关产品推荐
相关产品推荐

