1、使用 strtok 函数(标准做法)
使用 std::stringstream
对字符串进行分词(Tokenize)的 推荐 C++ 实现方式,适用于使用简单分隔符(如逗号、空格等)的场景。
#include <iostream> #include <sstream> #include <vector> #include <string> int main() { std::string str = "apple,banana,pear"; char delimiter = ','; std::stringstream ss(str); std::string token; std::vector<std::string> tokens; // 使用 getline 按分隔符提取子串 while (std::getline(ss, token, delimiter)) { tokens.push_back(token); } // 输出分词结果 for (const auto& t : tokens) { std::cout << "Token: " << t << std::endl; } return 0; }
2、使用 C 风格的 strtok(适用于 C 字符串)
使用 strtok
函数对字符串进行分词(Tokenize),strtok 会修改原始字符串,将分隔符替换为 \0
。原始字符串必须是可修改的字符数组(char[]
),不能直接使用 std::string
。多线程环境中不推荐使用 strtok
,可以改用线程安全版本 strtok_r
(在 POSIX 系统上可用)。
#include <iostream> #include <cstring> // 包含 strtok 和 strlen int main() { char str[] = "apple,banana,pear"; // 注意是 char 数组,不能用 string const char* delim = ","; char* token = std::strtok(str, delim); // 第一次传入原始字符串 while (token != nullptr) { std::cout << "Token: " << token << std::endl; token = std::strtok(nullptr, delim); // 后续传入 NULL,继续上一次的位置 } return 0; }
3、使用 std::regex(支持复杂分隔符)
支持多个字符或复杂正则作为分隔符(例如多个逗号、空格、管道符等),不会修改原始字符串,更灵活,适合复杂文本处理场景。
#include <iostream> #include <regex> #include <string> #include <iterator> int main() { std::string text = "apple, orange;banana mango,,grape"; // 使用正则表达式匹配一个或多个逗号、分号或空格作为分隔符 std::regex re("[,;\\s]+"); std::sregex_token_iterator iter(text.begin(), text.end(), re, -1); std::sregex_token_iterator end; for (; iter != end; ++iter) { if (!iter->str().empty()) { // 跳过空字符串 std::cout << "Token: " << *iter << std::endl; } } return 0; }
4、手动查找分隔符并切割
手动查找分隔符并切割字符串 是一种无需依赖外部库的方法,适用于需要更高灵活性或对性能有要求的场景。
#include <iostream> #include <vector> #include <string> // 自定义分词函数 std::vector<std::string> split(const std::string& str, char delimiter) { std::vector<std::string> result; size_t start = 0; size_t pos; while ((pos = str.find(delimiter, start)) != std::string::npos) { result.push_back(str.substr(start, pos - start)); // 提取子串 start = pos + 1; // 移动起始位置 } result.push_back(str.substr(start)); // 添加最后一段 return result; } int main() { std::string text = "apple,banana,pear"; std::vector<std::string> tokens = split(text, ','); for (const auto& token : tokens) { std::cout << "Token: " << token << std::endl; } return 0; }