C++分割字符串

博客介绍了依据指定字符来解析字符串,并将解析结果放置到vec中的操作,聚焦于字符串解析与存储的信息技术内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 依据指定字符,解析字符串,放置vec里。

void splitStr(const string& s, vector<string>& v, const string& c)
{
	string::size_type pos1, pos2;
    
        //找到字符,返回下标。
	pos2 = s.find(c);
	pos1 = 0;
	while(string::npos != pos2)
	{
		v.push_back(s.substr(pos1, pos2-pos1));

		pos1 = pos2 + c.size();
		pos2 = s.find(c, pos1);
	}
	if(pos1 != s.length())
	{
		v.push_back(s.substr(pos1));
	}
}

 

 

<think>好的,用户之前问过关于C++分割字符串的问题,并且我给出了几种不同的方法。现在用户再次提问“c++ 分割字符串”,我需要确保这次的回答既全面又简洁,同时考虑到用户可能的深层需求。 首先,用户可能已经看过之前的回答,但需要更详细的解释或不同的方法。或者他们可能希望得到更优化的代码,或者针对特定场景的解决方案。我需要检查之前的回答是否覆盖了所有常见方法,或者是否有遗漏。 之前的回答提到了四种方法:istringstream+getline、find+substr、正则表达式、Boost库。这些都是标准的方法,但可能用户需要更高效的实现,或者更简单的代码。另外,用户可能对某些方法的具体应用场景有疑问,比如处理多字符分隔符或保留空字符串。 我需要确保这次的回答结构清晰,每种方法都有示例代码和优缺点说明。同时,可能需要补充一些用户可能关心的点,比如性能比较,或者如何处理特殊字符。 另外,用户可能在实际使用中遇到了问题,比如分割后的空字符串处理,或者分隔符是多个字符的情况。这时候需要提供具体的解决方案,比如在第二种方法中如何修改代码来保留空部分。 还要注意是否应该推荐使用C++17的string_view来提高性能,尤其是在处理大字符串时。或者是否提到第三方库如absl的分割方法,但用户可能更倾向于标准库或Boost。 最后,相关问题部分需要覆盖用户可能遇到的常见问题,比如多分隔符、保留空字符串、性能优化等。确保问题具有针对性,能够引导用户进一步思考或查找解决方案。</think>在 C++ 中,字符串分割是一个常见需求,但标准库并未提供直接的 `split()` 函数(如 Python)。以下是几种主流实现方式,涵盖不同场景和性能考量。 --- ### ✅ 方法 1:使用 `std::istringstream` + `std::getline`(单字符分隔符) **适用场景**:按单字符分隔符(如逗号、空格)分割,且无需保留空字符串。 ```cpp #include <sstream> #include <vector> #include <string> std::vector<std::string> split(const std::string& s, char delimiter) { std::vector<std::string> tokens; std::string token; std::istringstream tokenStream(s); while (std::getline(tokenStream, token, delimiter)) { tokens.push_back(token); } return tokens; } ``` **特点**: - 简洁易懂,适合初学者。 - 自动跳过空字符串(如 `"a,,b"` 会得到 `["a", "b"]`)。 - **缺点**:无法处理多字符分隔符(如 `"||"`)。 --- ### ✅ 方法 2:使用 `std::string::find` + `substr`(多字符分隔符) **适用场景**:需要支持多字符分隔符(如 `", "` 或 `"||"`),或保留空字符串。 ```cpp #include <vector> #include <string> std::vector<std::string> split(const std::string& s, const std::string& delimiter) { std::vector<std::string> tokens; size_t start = 0; size_t end = s.find(delimiter); while (end != std::string::npos) { tokens.push_back(s.substr(start, end - start)); start = end + delimiter.length(); end = s.find(delimiter, start); } tokens.push_back(s.substr(start)); // 添加最后一个子串 return tokens; } ``` **特点**: - 支持多字符分隔符。 - 可通过修改代码保留空字符串(如 `"a,,b"` 保留中间的空字符串)。 - **缺点**:代码复杂度略高。 --- ### ✅ 方法 3:使用正则表达式(C++11+) **适用场景**:按复杂模式分割(如多个空格、标点符号混合)。 ```cpp #include <regex> #include <vector> #include <string> std::vector<std::string> split(const std::string& s, const std::string& pattern) { std::regex re(pattern); std::sregex_token_iterator first{s.begin(), s.end(), re, -1}, last; return {first, last}; } ``` **示例**: ```cpp std::string s = "a, b; c|d"; auto tokens = split(s, "[,;| ]+"); // 按逗号、分号、竖线或空格分割 // 输出: ["a", "b", "c", "d"] ``` **特点**: - 灵活支持复杂模式匹配。 - 需要 `<regex>` 头文件(C++11+)。 - **缺点**:正则表达式语法较复杂,可能影响性能。 --- ### ✅ 方法 4:使用 Boost 库(第三方) **适用场景**:项目允许使用 Boost,追求代码简洁和功能强大。 ```cpp #include <boost/algorithm/string.hpp> #include <vector> #include <string> std::vector<std::string> split(const std::string& s, const std::string& delimiter) { std::vector<std::string> tokens; boost::split(tokens, s, boost::is_any_of(delimiter)); return tokens; } ``` **特点**: - 代码简洁,功能丰富(如忽略大小写、跳过空部分)。 - **缺点**:依赖 Boost 库(非标准库)。 --- ### ✅ 方法 5:使用 C++17 `std::string_view`(高性能) **适用场景**:处理大字符串时避免频繁拷贝,提升性能。 ```cpp #include <string_view> #include <vector> std::vector<std::string_view> split(std::string_view s, char delimiter) { std::vector<std::string_view> tokens; size_t start = 0; size_t end = s.find(delimiter); while (end != std::string_view::npos) { tokens.push_back(s.substr(start, end - start)); start = end + 1; end = s.find(delimiter, start); } tokens.push_back(s.substr(start)); return tokens; } ``` **特点**: - 使用 `std::string_view` 避免拷贝,适合高性能场景。 - C++17 标准支持。 --- ### 📌 注意事项 1. **空字符串处理**: - 默认不保留空字符串(如 `"a,,b"` 会跳过中间空部分)。 - 需要保留时,可在 `find` + `substr` 方法中调整逻辑。 2. **性能优化**: - 对超长字符串使用 `std::string_view` 或 `std::span`(C++20)减少拷贝。 3. **多线程场景**: - 上述方法均为单线程,如需并发需自行加锁或使用线程安全容器。 4. **分隔符匹配**: - 若分隔符为多字符(如 `"||"`),需使用 `find` + `substr` 或正则表达式。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值