字符串分割(C++)

本文介绍了在C++中使用strtok函数、STL的find和substr方法以及Boost库进行字符串分割的示例,包括基本原理、代码实现和运行效果。

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

经常碰到字符串分割的问题,这里总结下,也方便我以后使用。

一、用strtok函数进行字符串分割

原型: char *strtok(char *str, const char *delim);

功能:分解字符串为一组字符串。

参数说明:str为要分解的字符串,delim为分隔符字符串。

返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。

其它:strtok函数线程不安全,可以使用strtok_r替代。

示例:

 1 //借助strtok实现split
 2 #include <string.h>
 3 #include <stdio.h>
 4 
 5 int main()
 6 {
 7         char s[] = "Golden Global      View,disk * desk";
 8         const char *d = " ,*";
 9         char *p;
10         p = strtok(s,d);
11         while(p)
12         {
13                 printf("%s\n",p);
14                 p=strtok(NULL,d);
15         }
16 
17         return 0;
18 }

为了帮助您更好地入门并深入掌握C++,我们精心准备了一系列丰富的学习资源包,包括但不限于基础语法教程、实战项目案例、核心概念解析以及进阶技巧指导等。

您只扫码上方二维码,即可免费获取这份专属的学习礼包。我们的教程覆盖了C++语言的各个方面,旨在让您在理论学习与实践操作中不断进步,提升编程技能。

同时,我们也鼓励您在学习过程中遇到任何问题时积极提问,我们会尽全力提供解答和帮助。期待您在C++编程的道路上越走越远,早日成为一位优秀的C++开发

 

 运行效果: 

### C++ 中实现字符串分割的方法 在 C++ 编程中,可以通过多种方式来实现字符串分割功能。以下是几种常见的方法及其对应的示例代码。 #### 方法一:使用 `std::istringstream` 实现字符串分割 通过 `std::istringstream` 类可以从输入流中逐部分提取数据,从而完成字符串分割操作。这种方法简单易懂且不需要引入额外的第三方库。 ```cpp #include <iostream> #include <sstream> #include <vector> #include <string> using namespace std; vector<string> split_with_istringstream(const string& str, char delimiter) { vector<string> result; istringstream iss(str); string token; while (getline(iss, token, delimiter)) { result.push_back(token); } return result; } int main() { string input = "apple-orange-banana"; char delimiter = '-'; vector<string> tokens = split_with_istringstream(input, delimiter); for (const auto& token : tokens) { cout << token << endl; } return 0; } ``` 此方法利用了标准库中的 `std::istringstream` 和 `std::getline()` 函数[^3]。 --- #### 方法二:使用 `strtok_r` 进行线程安全的字符串分割 如果需要在一个多线程环境中进行字符串分割,则推荐使用 POSIX 提供的线程安全版本函数 `strtok_r` 来替代传统的 `strtok`。 ```cpp #include <iostream> #include <cstring> using namespace std; int main() { char str[] = "Hello,World,How,Are,You"; const char delimiters[] = ","; char* context = nullptr; char* token = strtok_r(str, delimiters, &context); while (token != nullptr) { cout << token << endl; token = strtok_r(nullptr, delimiters, &context); } return 0; } ``` 上述代码展示了如何使用 `strtok_r` 对字符串按逗号分隔并逐一打印每个子串[^2]。 --- #### 方法三:借助 Boost 库实现更灵活的字符串分割 Boost 是一个广泛使用的开源 C++ 库集合,其中包含了强大的字符串处理工具。例如,可以使用 `boost::split` 轻松地依据多个分隔符对字符串进行切片。 ```cpp #include <iostream> #include <string> #include <vector> #include <boost/algorithm/string.hpp> using namespace std; int main() { string test = "i am a student,you are a teacher!"; vector<string> vec; boost::split(vec, test, boost::is_any_of(" ,"), boost::token_compress_on); for (size_t i = 0; i < vec.size(); ++i) { cout << vec[i] << endl; } return 0; } ``` 该方法允许一次性定义多个分隔符,并支持压缩连续空白字符的功能[^4]。 --- #### 总结 以上介绍了三种不同的 C++ 字符串分割技术,分别是基于标准库的 `std::istringstream`、POSIX 的 `strtok_r` 以及增强型第三方库 Boost 的解决方案。每种方案都有其适用场景和优缺点,在实际开发过程中可以根据具体需求选择合适的实现方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值