-2

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

我的情况是我试图在这个字符串中获取值 1.2597,而我的非功能性要求是使用strtok这里boost的许多其他编码人员推荐的值。

但是,我在将结果转换为可以使用strtok.

我想知道如何获得 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, ' ');
4

3 回答 3

2

您不能strtok直接在 C++ 上使用std::string。它需要一个可变的以零结尾的 C 样式字符串,并且没有标准方法可以访问该std::string形式的 a 的内容。

最简单的选择(不使用 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:它不是线程安全的。

于 2012-07-24T09:59:56.523 回答
1

是的,正如 Mike Seymore 所说,您必须将 std::string 复制到可变缓冲区。已经包含 string.h,只需使用 strcpy 将 std::string 复制到可变 char*。不要忘记包含空终止的空间 + 实际插入 '\0' ;D

std::string result = "...";
char* token;
char* buffer[res.length() + 1];  //Space for '\0'
strcpy(buffer, result.c_str());
buffer[res.length()] = '\0';     //insert '\0'
token = strtok(buffer, " ");
while (token != NULL) {
  /* work with token */
  token = strtok(NULL, " ");
}
于 2012-07-24T10:26:07.633 回答
1

这有效:

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);
于 2012-07-24T10:14:32.670 回答