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

Posted

技术标签:

【中文标题】字符串上 strtok() 的 C++ 用法【英文标题】:C++ usage of strtok() on string 【发布时间】:2012-07-24 09:53:02 【问题描述】:

我从回答我之前的question 的人那里尝试了以下代码。

我的情况是我试图在此字符串中获取值 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, ' ');

【问题讨论】:

strtok() 采用char*,而不是std::string(不要传递std::string::c_str(),因为strtok() 修改了提供的字符串)。请改用std::istringstream 只需使用std::string.find(),就像您在问题中查找字符串一样。 我的项目需要使用 strtok 来拆分字符串。 我在下面尝试了很多示例,但仍然出现错误。我如何使用 strtok 获得 1.2597 字符串 result="CCY 1.2597 Down 0.0021(0.16%) 14:32 SGT [44]"; 【参考方案1】:

您不能直接在 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 的另一个主要错误:它不是线程安全的。

【讨论】:

【参考方案2】:

这行得通:

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);

【讨论】:

您的代码确实有效,但我需要使用 strtok 函数进行拆分。 “分裂”是什么意思?【参考方案3】:

是的,正如 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, " ");

【讨论】:

这之后我如何获得令牌? 在while循环中。如果你找到了你的令牌,只需使用“break”语句离开循环。 “token”现在包含您想要的令牌以供进一步工作。

以上是关于字符串上 strtok() 的 C++ 用法的主要内容,如果未能解决你的问题,请参考以下文章

使用 strtok 解析字符串 - 在 C++ 中两次

strtok 并替换 C++ 中的子字符串

strtok/atoi/atof/atol函数用法 详解

strtok函数怎么用啊?

C语言字符串相关函数使用示例 strtok_r strstr strtok atoi

Android C++系列:Linux信号