您的位置:首页 > 编程语言 > C语言/C++

C++ 字符串分割的一些记录

2017-11-13 14:44 423 查看
有一个string如下:

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++