strtok_r并不比strtok好多少
2016-03-28 23:54
309 查看
前面批判了strtok, 本文来说说strtok_r, 后者在linux中才有, 虽然可冲入且线程安全, 但也不是什么好东西, 因为会改变原串, 如下:
#include <string>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int Str2Vector(const string& str, vector<string> &v, const char *p)
{
v.clear();
char *q;
char *pTmp = strtok_r(const_cast<char *>(str.c_str()), p, &q);
while(NULL != pTmp)
{
v.push_back(pTmp);
pTmp = strtok_r(NULL, p, &q);
}
return v.size();
}
int main()
{
string s = "|ab|cd|efg|h|";
string t = s;
vector<string> v;
Str2Vector(s, v, "|");
for(vector<string>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << endl;
}
cout << s << endl;
cout << t << endl;
return 0;
} 结果还是出人意料的如下结果:
taoge@localhost Desktop> g++ main.cpp
taoge@localhost Desktop> ./a.out
ab
cd
efg
h
|abcdefgh
|abcdefgh
taoge@localhost Desktop>
看来, 也不是什么好鸟。
#include <string>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int Str2Vector(const string& str, vector<string> &v, const char *p)
{
v.clear();
char *q;
char *pTmp = strtok_r(const_cast<char *>(str.c_str()), p, &q);
while(NULL != pTmp)
{
v.push_back(pTmp);
pTmp = strtok_r(NULL, p, &q);
}
return v.size();
}
int main()
{
string s = "|ab|cd|efg|h|";
string t = s;
vector<string> v;
Str2Vector(s, v, "|");
for(vector<string>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << endl;
}
cout << s << endl;
cout << t << endl;
return 0;
} 结果还是出人意料的如下结果:
taoge@localhost Desktop> g++ main.cpp
taoge@localhost Desktop> ./a.out
ab
cd
efg
h
|abcdefgh
|abcdefgh
taoge@localhost Desktop>
看来, 也不是什么好鸟。
相关文章推荐
- 折半查找
- Java 容器(list, set, map)
- js遍历数组和遍历对象的区别
- 面向对象基础——static关键字和代码块的使用
- ORDER BY 默认升序排列
- 2016第13周一
- oracle非归档模式下的冷备份和恢复
- Eclipse技巧(不断更新中
- du df区别
- JavaScript设计模式
- 修改常量指针所指向变量的方法
- C#的Socket编程基础——Unity的简单聊天室
- 生成验证码效果
- [经典] Best Time to Buy and Sell Stock
- 面向对象的三个基本特征
- 360java笔试编程第二题20160328
- 《linux内核设计与实现》读书笔记第十八章
- 问题集
- 一步一步写一个图片选择器 (ing)
- 一个好用的日期选择器