字符串上strtok()的C++用法

C++ usage of strtok() on string

本文关键字:C++ 用法 strtok 字符串      更新时间:2023-10-16

我从回答我之前问题的一个人那里尝试了以下代码。

我的情况是,我试图在这个字符串中获得值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, " ");
}