一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

C++怎样实现字符串的按模式分割并转换为整数容器

时间:2026-06-22 09:35:53 编辑:袖梨 来源:一聚教程网

std::regex_token_iterator 是最直接支持按任意正则模式分割的方案,适用于分隔符不固定场景,但 C++11 的 std::regex 在部分旧编译器(如 GCC)中存在兼容性问题。

std::regex_token_iterator 分割字符串并转整数

这是最直接支持“按任意正则模式分割”的方案,适合分隔符不固定(如多个空格、混合逗号/分号)的场景。但要注意:C++11 的 std::regex 在某些旧编译器(如 GCC std::regex_token_iterator 构造时若正则无效会抛 std::regex_error,务必捕获。

典型用法:

#include <regex>#include <vector>#include <string>#include <sstream><p>std::string s = "12, 34 ; 56t78";std::regex re(R"([s;,]+)"); // 匹配空格、逗号、分号、制表符等std::vector<int> nums;for (std::sregex_token_iterator it(s.begin(), s.end(), re, -1); it != std::sregex_token_iterator(); ++it) {if (!it->str().empty()) {nums.push_back(std::stoi(it->str()));}}</p>
  • -1 表示取非匹配部分(即分割后的子串),不是匹配结果本身
  • 空字符串可能被切出来(尤其首尾有分隔符时),需显式跳过
  • std::stoi 遇到非法字符会抛 std::invalid_argument,生产环境应加 try/catch

手写循环 + std::stringstream 处理简单分隔符

当分隔符是单个字符(如纯空格、纯逗号),不用正则更轻量、更可控。但 std::stringstream 默认只认空白符(isspace),对逗号、分号无效——必须手动找位置或换流方式。

推荐做法是用 std::getline 指定分隔符:

立即学习“C++免费学习笔记(深入)”;

std::string s = "1,2,3,4";std::vector<int> nums;std::stringstream ss(s);std::string token;while (std::getline(ss, token, ',')) {    if (!token.empty()) {        nums.push_back(std::stoi(token));    }}
  • 分隔符只能是单字节字符,',' 可以,"|>" 不行
  • 连续分隔符(如 "1,,2")会产生空 token,必须判空
  • 比正则快一个数量级,且无运行时正则编译开销

避免 std::stoi 崩溃的三种检查方式

用户输入或日志解析中,字符串常含非数字内容(如 "123abc""-"、空格混入)。直接调 std::stoi 会崩溃,不能只靠异常兜底。

  • 先用 std::all_of(token.begin(), token.end(), ::isdigit) ——但忽略负号和正号,需手动处理开头的 '-''+'
  • std::strtol 更稳妥:char* end; long v = std::strtol(token.c_str(), &end, 10);,检查 end != token.c_str() && *end == '

热门栏目