有一个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;
}