-
c++ 按分割符切割string字符串
2017-10-27 16:03:02/*************************************************** 函数名称: SplitString* 功能描述: 按切割符截取字符串* 参 数: const string & srcStr源字符串* 参 数: vector<string> &.../************************************************** * 函数名称: SplitString * 功能描述: 按切割符截取字符串 * 参 数: const string & srcStr源字符串 * 参 数: vector<string> & vec切割后的字符串存放容器 * 参 数: const string & separator切割符 * 返 回 值: void * 其他说明: * 其它说明: * 修改日期 修改人 修改内容 * -------------------------------------------- * **************************************************/ void SplitString(const string& srcStr, vector<string>& vec, const string& separator) { string::size_type posSubstringStart; // 子串开始位置 string::size_type posSeparator; // 分隔符位置 posSeparator= srcStr.find(separator); posSubstringStart= 0; while (string::npos != posSeparator) { vec.push_back(srcStr.substr(posSubstringStart, posSeparator- posSubstringStart)); posSubstringStart= posSeparator+ separator.size(); posSeparator= srcStr.find(separator, posSubstringStart); } if (posSubstringStart!= src.length()) // 截取最后一段数据 vec.push_back(srcStr.substr(posSubstringStart)); }
-
C++ 切割string splite方法的实现
2016-04-09 23:11:06vector splitStr(string str, char delimiter){ vector r; string tmpstr; while (!str.empty()){ int ind = str.find_first_of(delimiter); if (ind == -1){vector<string> splitStr(string str, char delimiter){ vector<string> r; string tmpstr; while (!str.empty()){ int ind = str.find_first_of(delimiter); if (ind == -1){ r.push_back(str); str.clear(); } else{ r.push_back(str.substr(0, ind)); str = str.substr(ind + 1, str.size() - ind - 1); } } return r; }
-
Java 字符串切割String str=in.nextLine(); String []data=str.split(",");
2020-04-03 20:56:05for(int i=0;i<n;i++){ String str=in.nextLine();...意思是将str这个字符串用’,'切割后分别放到data这个String类型的数组中 假设 我分别输入 123 456 789 最后得到的data数组内容是:123,456,789 ...for(int i=0;i<n;i++){ String str=in.nextLine(); String []data=str.split(","); }
意思是将str这个字符串用’,'切割后分别放到data这个String类型的数组中
假设
我分别输入123 456 789
最后得到的data数组内容是:123,456,789
-
c++ 按分割符(忽略多次出现)切割string字符串
2019-09-09 09:48:21返回值:一个vector,里面元素是string类型。 vector < string > split ( const string & strs , const string & delim ) { vector < string > res ; if ( strs == "" ) return res ; ...最近在做各家公司的笔试题,每次花在数据输入上时间很多,尤其是遇到字符串问题,总是卡壳。而其中最麻烦的就是输入一串字符串,以分隔符进行分隔,比如逗号,忽略出现多次的情况。因为C++不像python和Java有很好的库函数帮助我们,唯一可用的Boost库不能用,这也强迫我们使用自己定义的split函数了。所以,这篇文章也是自己的一个总结,希望自己以后可以查阅,也可以帮助其他需要的同学。
1. 问题描述
- 基础版本:给定一个字符串比如"aa,bb,cc,dd,ee" 让你取出其中的"aa" “bb” “cc” “dd” "ee"五个元素。
- 进阶版本: 给定一个字符串比如"aa, , , ,bb,cc, , ,dd, , , ,ee,“让你忽略其中逗号出现多次的情况,还是输出"aa” “bb” “cc” “dd” "ee"五个元素。
2. 解决思路
关于自定义字符串分割网上有几种方法
- 使用
strtok
函数 - 使用
stringstream
方法 - 使用
boost::split方法
这里的话,因为第三种方法一般的OJ平台可能不能使用
boost
库了,这里也就不做介绍了,大家感兴趣可以去网上看看。3. 自定义分隔字符串二种方法
一般情况下,我们想拿到一个字符串分隔的函数,就想直接可以用,所以这里的话,我们只把代码贴一下,具体的原理的话网上也是很多,也就不太详细介绍了。
3.1 使用
strtok
实现自定义split
函数函数说明:
- strs: 输入字符串,是你要分隔的字符串,比如"aa,bb,cc,dd"或者"aa, , bb, , ,ccc" 它是可以接受多个分隔符的,并自动忽略。
- delim: 是分隔符,比如逗号或者其他符号。多个情况也就使用一编就好了。接受参数是字符串。
- 返回值:一个vector,里面元素是string类型。
vector<string> split(const string& strs, const string& delim) { vector<string> res; if (strs == "") return res; char* str = new char[strs.size() + 1]; strcpy(str, strs.c_str()); char* d = new char[delim.size() + 1]; strcpy(d, delim.c_str()); char* p = strtok(str, d); while (p) { string temp = p; res.push_back(temp); p = strtok(NULL, d); } delete[]str; delete[]d; return res; }
3.2 使用
stringstream
实现自定义split
函数函数说明:
- strs: 输入字符串,是你要分隔的字符串,比如"aa,bb,cc,dd"。这里注意一下:这种方法不能忽略分隔符出现多次的情况,也就是只能处理分隔符出现一次情况。
- delim: 是分隔符,比如逗号或者其他符号。只能是一个char类型,也就是接受一个字符。
- 返回值:一个vector,里面元素是string类型。
vector<string> split2(const string& strs, const char& delim) { vector<string> res; if (strs == "") return res; stringstream sstr(strs); string token; while (getline(sstr, token, delim)) { res.push_back(token); } return res; }
4. 实验
4.1 处理单个分隔符的情况
比如处理:
str1 = "aa,bb,cc,dd,ee"
。#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <vector> #include <string> #include <algorithm> #include <sstream> #include <stdlib.h> using namespace std; vector<string> split(const string& strs, const string& delim) { vector<string> res; if (strs == "") return res; char* str = new char[strs.size() + 1]; strcpy(str, strs.c_str()); char* d = new char[delim.size() + 1]; strcpy(d, delim.c_str()); char* p = strtok(str, d); while (p) { string temp = p; res.push_back(temp); p = strtok(NULL, d); } delete[]str; delete[]d; return res; } vector<string> split2(const string& strs, const char& delim) { vector<string> res; if (strs == "") return res; stringstream sstr(strs); string token; while (getline(sstr, token, delim)) { res.push_back(token); } return res; } int display(vector<string>& res) { int count = 0; for (auto it : res) { cout << it << " "; count++; } cout << endl; return count; } int main() { string strs1 = "aa,bb,cc,dd,ee"; string strs2 = "aa,,,,bb,cc,,,dd,,,,ee,,"; vector<string> res1 = split(strs1, ","); int count1 = display(res1); cout << count1 << endl; vector<string> res2 = split2(strs1, ','); int count2 = display(res2); cout << count2 << endl; system("pause"); return 0; }
4.2 处理分隔符出现多次的情况
比如处理:
str2 = "aa,,,,bb,cc,,,dd,,,,ee,,"
。#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <vector> #include <string> #include <algorithm> #include <sstream> #include <stdlib.h> using namespace std; vector<string> split(const string& strs, const string& delim) { vector<string> res; if (strs == "") return res; char* str = new char[strs.size() + 1]; strcpy(str, strs.c_str()); char* d = new char[delim.size() + 1]; strcpy(d, delim.c_str()); char* p = strtok(str, d); while (p) { string temp = p; res.push_back(temp); p = strtok(NULL, d); } delete[]str; delete[]d; return res; } vector<string> split2(const string& strs, const char& delim) { vector<string> res; if (strs == "") return res; stringstream sstr(strs); string token; while (getline(sstr, token, delim)) { res.push_back(token); } return res; } int display(vector<string>& res) { int count = 0; for (auto it : res) { cout << it << " "; count++; } cout << endl; return count; } int main() { string strs1 = "aa,bb,cc,dd,ee"; string strs2 = "aa,,,,bb,cc,,,dd,,,,ee,,"; vector<string> res1 = split(strs2, ","); int count1 = display(res1); cout << count1 << endl; vector<string> res2 = split2(strs2, ','); int count2 = display(res2); cout << count2 << endl; system("pause"); return 0; }
5. 实验说明
- 从结果上看 使用
strtok
函数 和stringstream
方法都可以很好的处理单个分隔符的情况。 - 但是存在分隔符重复出现的情况下,
stringstream
方法不能很好的处理,strtok
仍然可以很好的处理。
6. 参考文章
- strtok()函数详解!
- C++ 字符串的分割函数split 及 用法
- c++如何分割带有逗号的字符串
- C++常用字符串分割方法
- C++分割字符串(以逗号分隔符为例,分割得到相应数字)
- C/C++ 使用delete删除指针需小心 “野指针”
上面的实现方法可能不是最优的,也会出现一些Bug,希望大家可以批评指正,一起学习。之前一直想要写总结,但是一直没写,现在终于写完了,也算是很Nice的。
-
用 CTE (Common Table Expressions) 切割 string
2009-11-14 08:14:00相比利用临时表的方法,用CTE的Recursive特性可以以很高的效率切割字符串。 下面是我写的一个UDF利用CTE 切割字符串的。CREATE FUNCTION StrSplit(@s NVARCHAR(4000), @sep NVARCHAR(5))RETURNS TABLEAS RETURN -
string切割
2018-02-02 21:35:54#incldue using namespace std; #incldue #incldue typedef std::vector vecStr;...void SubStr(vecStr& toke, const std::string& src, const std::string& spec) { size_t Pos = 0; size_t Pre -
String字符串的切割,拼接
2019-12-27 21:06:51String字符串的切割,获取中括号里的数据 //拿到字符串里的值 String s = "[115.89958,37.792965]"; //对字符串进行替换切割 String s1 = s.replace("[", ""); ... -
切割c++ string的substr
2018-03-30 22:00:34参考 http://www.cplusplus.com/reference/string/string/std::string::substrstring substr (size_t pos = 0, size_t len = npos) const;Generate substringReturns a newly constructed string object with its ... -
String 字符串切割
2019-09-04 15:59:13使用split()进行分割字符串,注意切割按照正则切割,如遇到特殊字符要+\\ package String; public class splitString { public static void main(String[] args) { //字符串替换 String str = "HelloWord"; ... -
c++ string 切割_Java中String类常用方法
2021-01-12 16:31:51public class String_main { public static void main(String[] args) { // String类常用方法 String str = "Hello Word!";// charAt()截取一个字符。 System.out.println(str.charAt(0)); System.out.prin... -
stringstream切割字符串
2019-01-27 14:39:34这样就实现了字符串的空格切割。 #include<bits/stdc++.h> #include<sstream> //头文件 using namespace std; int main(){ string str="nice to meet you"; string... -
String切割的方法。
2017-09-22 17:21:41String s=lioos; char a[]=s.toCharArray();...其中是把S字符串,切割成数组。 而split(参数),是通过某一固定参数,来分割字符串。返回一个数组。 String s=1#2#3# char a[]=s.split("#"); -
String split()切割方法
2020-08-11 16:43:43链接: https://www.runoob.com/java/java-string-split.html. 小结: 1)String的切割方法split(), 2)split()与substring()的区别: split() 获得该字符串的所有;substring() 获得某段字符串; -
String字符串的切割
2018-10-09 08:16:12string str = “123abc456”; int i = 3; 取字符串的前i个字符 str=str.Substring(0,i); 去掉字符串的前i个字符 str=str.Substring(i); 从右边开始取i个字符 str=str.Substring(str.Length-i); 从右边开始... -
c++ string 切割_图像批量切割并输出(C语言)
2021-01-17 02:59:43切割尺寸可以手动输入(要自己添加或替换相应代码)本示例是按200像素为单位切割的支持纵向切割和横向切割,最后一个碎片若不足200像素会自动补齐到上一张切割碎片的后面,所以最后一张切割碎片有可能不是200像素宽/... -
String字符串切割问题
2016-01-14 17:54:16String str="88%"; 问题来了 只要88怎么去掉%? 方法很多: eg1. 用替换 String str = "88%"; String newStr = str.replaceAll("%",""); eg2.切掉最后一位 String str = "88%"; String newStr =str.... -
String字符串 切割和替换
2018-09-29 11:24:38public static void main(String[] args) { String str = "adb,de,fg"; /** * 在当前字符串中,用后面的替换掉字符串中所有出现的前面的,返回新的字符串 */ String replace = str.replace(&... -
EditText限制、String切割
2016-04-20 10:49:15EditText ...String str = “abc,def;gh,ij;k;lm,no,p;qr,st”; StringTokenizer st = new StringTokenizer(str,”,;”); while(st.hasMoreTokens() ){ System.out.println(st.nextToken()); } -
运用stringstream进行类型转换和字符串切割
2020-05-24 16:40:41string转int: int a = 3; string tem="12"; stringstream ss; ss << tem; ...int转string: ... string tem="12";... stringstream ss;... //tem会变为string类型"3" ...以空格为切割符的字符串切割: string sentence= -
【ACM】stringstream切割字符串
2016-11-02 19:12:01stringstream切割字符串 string num; stringstream ssnum; getline(cin,num); ssnum.clear(); ssnum.str(num); int i=0; while(1) { ssnum&gt;&gt;a[i++]; if(ssnu... -
std::string 字符串切割
2018-07-27 14:17:00在很多字符串类库里都实现了split函数。不过在std里没有实现。...string> 2 #include <vector> 3 using namespace std; 4 5 vector<string> split(string strtem,char a) 6... -
string 获取 判断 转换 替换 切割 子串 转换
2014-10-13 16:09:25String -
String字符串切割数组 逗号 数字 数组
2019-07-01 14:56:24/** * 解析请求的字符串数组 * @param packNo 请求的字符串 如:12,13,15,666 * @return */ private List<String> getRequestParam(String packNo) { List<String> list = new Ar... -
c++ string 切割_jdk8 stream list分割 切割 分批次处理工具类
2020-12-26 19:11:05直接上码样式超赞好看的原文链接原文链接:jdk8 stream list分割 切割 分批次处理工具类blog.csdn.netpackage com.store.common.utils;import java.util.*;import java.util.stream.Collectors;im...
收藏数
1,955
精华内容
782