C++ 字符串分割的一些记录
2017-11-13 14:44
423 查看
有一个string如下:
将这个string以符号 | 分割开,可以使用strtok函数。
str是要分割的字符串,s是分割的依据。
第一次分割时str输入要分割的字符串指针,之后如果返回非空,则这个参数输入NULL继续分割之后的部分,每次分割返回分割后的字符串的指针,可以用一个vector< string >来保存分割下来的各个字符串,当分割完毕会返回NULL。
例子:
后续计算要采用int,而不是string,所以这里涉及到string转int的问题。
采用stringstream进行转换(头文件intclude< sstream >)
例子:
PS:记录一个bug
上述代码运行会出错,原因在于最后删除 | 时end()值会随之发生变化(’\0’前移一个单位到现在 | 所在的位置),但是随之it会进行自加,这样会跳过最后的’\0’,造成越界。DEBUG一下会更清楚这里的内存指针变化。
改成下面这样就不会出错了。
本次记录来源于这个小程序,记录如下:
string str = "1311|1337|1357|1294|1325|1337|1333|1340|1325|1347|1353|1350|1313|1341|1346|1336|";
将这个string以符号 | 分割开,可以使用strtok函数。
str是要分割的字符串,s是分割的依据。
strtok(char *str, char *s);
第一次分割时str输入要分割的字符串指针,之后如果返回非空,则这个参数输入NULL继续分割之后的部分,每次分割返回分割后的字符串的指针,可以用一个vector< string >来保存分割下来的各个字符串,当分割完毕会返回NULL。
例子:
string str = "1311|1337|1357|1294|1325|1337|1333|1340|1325|1347|1353|1350|1313|1341|1346|1336|"; char *strc = new char[str.size() + 1]; strcpy(strc, str.c_str()); vector<string> resultVec; char *s = "|"; char *tmpStr = strtok(strc, s); //第一次分割 while(tmpStr != NULL){ resultVec.push_back(string(tmpStr)); tmpStr = strtok(NULL, s); //后续分割输入NULL }
后续计算要采用int,而不是string,所以这里涉及到string转int的问题。
采用stringstream进行转换(头文件intclude< sstream >)
例子:
vector<int> res; //保存转换后的数组 vector<string>::iterator sit; //迭代器 vector<int>::iterator it; for(sit = resultVec.begin(); sit != resultVec.end(); ++sit){ stringstream ss; int trans; if(*sit != ""){ ss << *sit; //输入 ss >> trans; //输出 res.push_back(trans); //保存 } }
PS:记录一个bug
string str = "1311|1337|1357|1294|1325|1337|1333|1340|1325|1347|1353|1350|1313|1341|1346|1336|"; string::iterator it; for(it = str.begin(); it != str.end(); ++it){ if(*it == '|') str.erase(it); } //cout << str;
上述代码运行会出错,原因在于最后删除 | 时end()值会随之发生变化(’\0’前移一个单位到现在 | 所在的位置),但是随之it会进行自加,这样会跳过最后的’\0’,造成越界。DEBUG一下会更清楚这里的内存指针变化。
改成下面这样就不会出错了。
string str = "1311|1337|1357|1294|1325|1337|1333|1340|1325|1347|1353|1350|1313|1341|1346|1336|"; string::iterator it; for(it = str.begin(); it != str.end()-1; ++it){ if(*it == '|') str.erase(it); } it = str.end() - 1; if(it == '|') str.erase(str.end() - 1); //cout << str;
本次记录来源于这个小程序,记录如下:
#include <iostream> #include <string> #include <cstring> #include <vector> #include <sstream> using namespace std; int main() { string str = "1311|1337|1357|1294|1325|1337|1333|1340|1325|1347|1353|1350|1313|1341|1346|1336|"; char *strc = new char[str.size() + 1]; strcpy(strc, str.c_str()); vector<string> resultVec; char *s = "|"; char *tmpStr = strtok(strc, s); while(tmpStr != NULL){ resultVec.push_back(string(tmpStr)); tmpStr = strtok(NULL, s); } /* string::iterator it; for(it = str.begin(); it != str.end()-1; ++it){ if(*it == '|') str.erase(it); } it = str.end()-1; if(*it == '|') str.erase(str.end() - 1); cout << str; */ int mmin = 2000; int mmax = 0; vector<int> res; vector<string>::iterator sit; vector<int>::iterator it; for(sit = resultVec.begin(); sit != resultVec.end(); ++sit){ stringstream ss; //这里的ss如果定义在for循环之外,则在每一次转换后都要执行ss.clear() int trans; if(*sit != ""){ ss << *sit; ss >> trans; res.push_back(trans); } } for(it = res.begin(); it != res.end(); ++it){ if(*it > mmax) mmax = *it; if(*it < mmin) mmin = *it; } for(int i = mmax - 255; i < mmin; i++){ string ans; for(it = res.begin(); it != res.end(); ++it){ ans += *it - i; } cout << ans << endl; } return 0; }
相关文章推荐
- c++分割字符串,strtok与strtok_r的使用记录
- C++:字符串分割
- Delphi中的一些字符串分割的函数收集
- C++ 分割字符串
- C++ 分割字符串,可以识别开头的,中间的,末尾的一个或者多个空格
- c++如何分割字符串示例代码
- Java 根据一些特殊分割规则分割字符串
- C++中的Split函数(字符串自动分割)
- C++学习记录11--字符串中删除特定元素
- C/C++中的字符串分割
- c++字符串的一些总结
- C++字符串分割总结
- 刚学了一些C++的书上没见过的符号,记录一下
- hdu 2072 1106学一波字符串分割,C语言与C++两种方法
- 【工作记录】C++ 浮点数、字符串的比较
- C++:实现split分割字符串 - 改进
- C++分割字符串
- c++作业记录,统计字母&字符串翻转
- c++分割字符串
- C++ 字符串分割方法 实现split