C++字符串分割

c++字符串分割 Split

在看OpenCV 源码偶然间发现一个实现极其简洁的split 函数。

opencv 版本 :3.4.0
文件 :modules/core/src/ocl.cpp

/**

@param s 输入字符串
@param delim  分割符
@param elems  元素容器
*/
static void split(const std::string &s, char delim, 
std::vector<std::string> &elems)
{
    elems.clear();
    if (s.size() == 0)
        return;
    std::
### C++ 字符串分割功能的实现 在 C++ 编程中,字符串分割是一项常见的需求。以下是几种常用的实现方式及其对应的示例代码。 #### 方法一:自定义 `split` 函数 通过手动遍历字符串并按指定分隔符进行切割,可以构建一个通用的 `split` 函数来完成此任务[^1]: ```cpp #include <iostream> #include <vector> #include <string> std::vector<std::string> split(const std::string& str, const std::string& delim) { std::vector<std::string> result; if (str.empty()) return result; char* pStr = new char[str.length() + 1]; strcpy(pStr, str.c_str()); char* pSave = nullptr; char* pToken = strtok_s(pStr, delim.c_str(), &pSave); while (pToken != nullptr) { result.push_back(std::string(pToken)); pToken = strtok_s(nullptr, delim.c_str(), &pSave); } delete[] pStr; return result; } int main() { std::string input = "apple,banana,cherry"; std::vector<std::string> fruits = split(input, ","); for (const auto& fruit : fruits) { std::cout << fruit << std::endl; } } ``` 上述代码实现了基于任意分隔符的字符串分割,并返回存储各部分的结果向量。 --- #### 方法二:利用标准库函数 `strtok_r` `strtok_r` 是线程安全版本的字符串分割工具,适合于多线程环境下的应用开发[^2]。下面是一个简单的例子展示其用法: ```cpp #include <iostream> #include <cstring> #include <cstdlib> void tokenize(const char* str, const char* delims) { char *token, *rest; token = strtok_r((char*)str, delims, &rest); while (token != nullptr) { std::cout << token << std::endl; token = strtok_r(NULL, delims, &rest); } } int main() { const char* data = "hello-world-this-is-cpp"; const char* delimiter = "-"; tokenize(data, delimiter); } ``` 注意,由于 `strtok_r` 修改输入字符串的内容,因此通常需要复制原始数据后再调用该函数。 --- #### 方法三:使用 STL 容器与算法组合 借助现代 C++ 的强大特性,还可以采用更简洁的方式完成相同目标[^3]: ```cpp #include <iostream> #include <sstream> #include <vector> #include <iterator> std::vector<std::string> split(const std::string& s, char delimiter) { std::vector<std::string> tokens; std::stringstream ss(s); std::string item; while (getline(ss, item, delimiter)) { tokens.emplace_back(item); } return tokens; } int main() { std::string text = "one two three four five six seven eight nine ten"; std::vector<std::string> words = split(text, ' '); for (size_t i = 0; i < words.size(); ++i) { std::cout << "[" << i << "]=" << words[i] << "\n"; } } ``` 这种方法无需额外依赖外部库即可高效工作,尤其推荐给初学者学习和实践。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值