在C++中没有直接对应的split函数,字符串分割可借助以下方法实现:

1、借助strtok函数

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

函数功能:以delim为分隔符分割字符串str

参数说明:str:要分隔的字符串;delim:分隔符

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

代码1:直接使用strtok函数分割char*类型的字符串

代码2:借助strtok分割string类型的字符串,将结果保存在vector<string>中

#include <iostream>
using namespace std; int main() {
char s[] = "my name is lmm";
char *p;
const char *delim = " ";
p = strtok(s, delim);
while(p) {
cout << p << endl;
p = strtok(NULL, delim);
} return 0;
}

  

思路:先将整个string字符串转换为char*类型,分割后得到char*类型的子字符串,将子字符串转换为string类型,并存入结果数组中。

#include <iostream>
#include <vector>
using namespace std; vector<string> split(const string& str, const string& delim) {
vector<string> res;
if("" == str) return res;
//先将要切割的字符串从string类型转换为char*类型
char * strs = new char[str.length() + 1] ; //不要忘了
strcpy(strs, str.c_str()); char * d = new char[delim.length() + 1];
strcpy(d, delim.c_str()); char *p = strtok(strs, d);
while(p) {
string s = p; //分割得到的字符串转换为string类型
res.push_back(s); //存入结果数组
p = strtok(NULL, d);
} return res;
} void test1() { //空字符串
cout << "******test1****** "<<endl;
string s = ""; std::vector<string> res = split(s, " ");
for (int i = 0; i < res.size(); ++i)
{
cout << res[i] <<endl;
}
} void test2() { //只有一个字符串
cout << "******test2****** " <<endl;
string s = "my"; std::vector<string> res = split(s, " ");
for (int i = 0; i < res.size(); ++i)
{
cout << res[i] <<endl;
}
} void test3() { //正常字符串
cout << "******test3****** "<<endl;
string s = "my name is lmm ";//连续多个空格,空格会被过滤掉 std::vector<string> res = split(s, " ");
for (int i = 0; i < res.size(); ++i)
{
cout << res[i] <<endl;
}
} int main() { test1();
test2();
test3();
return 0;
}

  

注意:test3中连续多个空格出现,空格都会被过滤掉

2、借助于string类的find和substr函数

1)find函数

函数原型:size_t find(const string& str, size_t pos = 0) const;

功能说明:从pos位置开始查找子字符串str第一次出现的位置

参数说明:str为要查找的子字符串,pos从为初始查找位置

返回值:找到的话返回子字符串第一次出现的位置,否则返回string::npos

2)substr函数

函数原型:string substr(size_t pos = 0, size_t n = npos) const;

功能说明:获取从指定的起始位置开始,长度为n的子字符串

参数说明:pos为起始位置,n获取的1字符串长度

返回值:子字符串

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
using namespace std; string reverse_one_word(string str) {
for(int i = 0; i < str.length()/2; i ++) {
char tmp;
tmp = str[i];
str[i] = str[ str.length() - i - 1 ];
str[ str.length() - i - 1 ] = tmp;
}
return str;
} vector<string> split(const string& str,const string& delim) { //将分割后的子字符串存储在vector中
vector<string> res;
if("" == str) return res; string strs = str + delim; //*****扩展字符串以方便检索最后一个分隔出的字符串
size_t pos;
size_t size = strs.size(); for (int i = 0; i < size; ++i) {
pos = strs.find(delim, i); //pos为分隔符第一次出现的位置,从i到pos之前的字符串是分隔出来的字符串
if( pos < size) { //如果查找到,如果没有查找到分隔符,pos为string::npos
string s = strs.substr(i, pos - i);//*****从i开始长度为pos-i的子字符串
res.push_back(s);//两个连续空格之间切割出的字符串为空字符串,这里没有判断s是否为空,所以最后的结果中有空字符的输出,
i = pos + delim.size() - 1;
} }
return res;
} void test1() { //空字符串
cout << "******test1****** "<<endl;
string s = ""; std::vector<string> res = split(s, " ");
for (int i = 0; i < res.size(); ++i)
{
cout << res[i] <<endl;
}
} void test2() { //只有一个字符串
cout << "******test2****** " <<endl;
string s = "my"; std::vector<string> res = split(s, " ");
for (int i = 0; i < res.size(); ++i)
{
cout << res[i] <<endl;
}
} void test3() { //正常字符串
cout << "******test3****** "<<endl;
string s = "my name is lmm "; std::vector<string> res = split(s, " ");
for (int i = 0; i < res.size(); ++i)
{
cout << res[i] <<endl;
}
} int main() { test1();
test2();
test3();
return 0;
}

  

注意:test3中的多个空格未被过滤掉,也就是说两个空格分隔符之间的空子串也被存进了结果数组中。要想避免这个问题可以在分隔出子字符串s时,判断一下若为空(两个分隔符相邻,中间的子串为空),则不加入字符数组即可去掉。

C++之split字符串分割的更多相关文章

  1. Split字符串分割函数

    非常非常常用的一个函数Split字符串分割函数. Dim myTest myTest = "aaa/bbb/ccc/ddd/eee/fff/ggg" Dim arrTest arr ...

  2. freemarker中的split字符串分割

    freemarker中的split字符串分割 1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串 ...

  3. freemarker中的split字符串分割(十六)

    1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串分割--> <#list &quo ...

  4. hive函数 -- split 字符串分割函数

    hive字符串分割函数 split(str, regex) - Splits str around occurances that match regexTime taken: 0.769 secon ...

  5. javascript中split字符串分割函数

    1. var ss=s.split("fs"); for(var i=0;i<ss.length;i++){ 处理每一个ss[i]; } 2. "2:3:4:5&q ...

  6. 【pandas】pandas.Series.str.split()---字符串分割

    原创博文,转载请注明出处! 本文代码的github地址       series中的元素均为字符串时,通过str.split可将字符串按指定的分隔符拆分成若干列的形式. 例子: 拆分以逗号为分隔符的字 ...

  7. freemarker split字符串分割 遍历map

    <#list "张三三,李思思,,王强,柳树,诸葛正我"?split(",") as name> "${name}" </ ...

  8. java/Android String.split 字符串分割

    特殊符号分割时需加[].如下图

  9. 【转载】 C++之split字符串分割

    https://blog.csdn.net/mary19920410/article/details/77372828

  10. 在C++中实现字符串分割--split

    字符串分割 在一些比较流行的语言中,字符串分割是一个比较重要的方法,不论是在python,java这样的系统级语言还是js这样的前端脚本都会在用到字符串的分割,然而在c++中却没有这样的方法用来调用. ...

随机推荐

  1. windows自带xbox game bar如何更改录制视频保存位置

      若要更改保存游戏剪辑的位置,请使用文件资源管理器根据需要将"捕获"文件夹移动到电脑上的任意位置. Windows 会将游戏剪辑和屏幕截图保存在该文件夹中(无论移动到哪里).   ...

  2. Deer_GF之UI界面制作

    Hi,今天介绍一下Deer_Gf里的界面制作.       在游戏制作的过程中,游戏界面占到游戏的百分之八十,可以快速开发界面,对游戏开发有很大帮助.       所以在Deer_Gf框架里,为了让开 ...

  3. git手记

    参照的是http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000这里的,git教程确实写得不 ...

  4. SAP 开具发票的抬头文本带到会计凭证上

    #需求 将开具发票的抬头文本带到会计凭证上.方便财务处理凭证,不然需要再去编辑凭证,容易遗忘. 达到的效果如图所示: #二代增强SDVFX001 事务码cmod分配增强 编写增强出口 代码如下: DA ...

  5. 如何在mac上配置Apache服务器

    ​ 如何在mac上配置Apache服务器 1. 打开终端,开启Apache: //开启apache:  sudo apachectl start //重启apache:  sudo apachectl ...

  6. Elasticsearch使用示例

    简单示例 import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.extension.service.impl.Ser ...

  7. 一、100ASK_IMX6ULL嵌入式裸板学习_LED实验(知识点补充二)

    MUX是什么?   MUX(multiplexer数据选择器):   在多路数据传送过程中,能够根据需要将其中任意一路选出来的电路,叫做数据选择器,也称多路选择器或多路开关.   多路转换器的作用主要 ...

  8. 「SOL」Quick Tortoise (Codeforces)

    只能说没想到 题面 给出一个 \(n\times m\) 的网格图,每个格子要么是空地要么是障碍. 给出 \(q\) 个询问,每次给出 \((sx, sy),(ex,ey)\),问从 \((sx,sy ...

  9. 5. nginx跨域配置

    1.跨域问题处理:在nginx相关接口上配置如下: 如接口有自己的请求头,则加上:如接口自带请求头pubacc-buid if ($request_method = "OPTIONS&quo ...

  10. 莫烦Python 4

    莫烦Python 4 新建模板小书匠 RNN Classifier 循环神经网络 问题描述 使用RNN对MNIST里面的图片进行分类 关键 SimpleRNN()参数 batch_input_shap ...