字符串上strtok()的C++用法
C++ usage of strtok() on string
我从回答我之前问题的一个人那里尝试了以下代码。
我的情况是,我试图在这个字符串中获得值1.2597,我的非功能性要求是使用strtok
,而不是boost
,这是这里许多程序员推荐的。
然而,我在将结果转换为可以使用strtok
的cstr*时遇到了一个问题。
我想知道如何获得1.2597,并用strtok
进行响应
string result= "CCY 1.2597 Down 0.0021(0.16%) 14:32 SGT [44]";
char *first = strtok(result, ' ');
char *second = strtok(0, ' ');
不能在C++std::string
上直接使用strtok
。它需要一个可变的以零结尾的C样式字符串,并且没有标准的方法来访问该形式的std::string
的内容
最简单的选择(不使用Boost或其他非标准库)是使用C++流:
std::stringstream stream(result);
std::string first, second;
stream >> first >> second;
如果您想要的话,也可以将第二个令牌直接转换为数字类型。
如果出于某种原因您真的想使用strtok
,那么一种可能性是将字符串复制到临时可变缓冲区:
std::vector<char> temp(result.begin(), result.end());
temp.push_back(0);
char * first = strtok(&temp[0], ' ');
char * second = strtok(0, ' ');
请注意strtok
的另一个主要故障:它不是线程安全的。
这是有效的:
std::string result= "CCY 1.2597 Down 0.0021(0.16%) 14:32 SGT [44]";
size_t pos0 = result.find(' ');+1
size_t pos1 = result.find(' ',pos0);
std::string final_result = result.substr(pos0,pos1-pos0);
是的,正如Mike Seymore所说,您必须将std::字符串复制到可变缓冲区。已经包含了string.h,只需使用strcpy将std::string复制到可变的char*中。不要忘记包含空终止+实际插入"\0"的空格;D
std::string result = "...";
char* token;
char* buffer[res.length() + 1]; //Space for ' '
strcpy(buffer, result.c_str());
buffer[res.length()] = ' '; //insert ' '
token = strtok(buffer, " ");
while (token != NULL) {
/* work with token */
token = strtok(NULL, " ");
}
相关文章:
- 这个指针在c++中的用法
- 当C++中需要自动删除时,这是静态的正确用法吗?
- libstdc++ 文件系统中未初始化的用法?
- 复制和交换习惯用法与移动操作之间的交互
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 命名参数习惯用法和(抽象)基类
- 省略号在C++中的所有用法
- () 在 C++ 11 中的特殊而奇怪的用法?
- 构造函数的用法
- 模板类中自动的类用法不完整
- 这里的 = 运算符有什么用法?
- 什么模板用法在阶乘中更好
- 如果可变长度元素的constexpr用法得到<>
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- C++ 中函数中 Const 用法之间的差异
- equal_to模板类C++用法
- PCL 中的 GICP 用法
- 向量的正确用法<int>::size_type
- C++命名空间的基本用法