strtok():将字符串转换为char *

时间:2012-10-23 00:10:22

标签: c++ string tokenize

  

可能重复:
  Splitting a string in C++

char *strtok(char *s1, const char *s2)

如何根据string的要求将strtok转换为字符*?我做了

for (string line; getline(sourceFile, line);) {
    tokens = strtok(line.c_str(), " {};");
}

其中sourceFileifstreamsourceFile.open(filepath.c_str());

我得到了:

  

类型“const char *”的参数与“char *”

类型的参数不兼容

3 个答案:

答案 0 :(得分:2)

正如其他人所说,你可能想要使用strtok以外的其他东西。

然而,要做你想要的(你可能不应该):

for (string line; getline(sourceFile, line);) {
    char* line_cstr = strdup(line.c_str());

    char* token = strtok(line_cstr, " {};");

    while ((token = strtok(NULL, " {};")) != NULL) {
        //code
    }

    free(line_cstr);

}

答案 1 :(得分:0)

如果您这样做:

char fp[40];  // or some reasonable size
strcpy( fp, filepath.c_str()); // fp is not a const char* like c_str() returns

您应该能够strtok()使用fp

但您可能需要考虑更多C++分割字符串的方法。

答案 2 :(得分:0)

正如Jonathan Leffler的评论所解释的那样,strtok实际上修改了缓冲区来终止连续的令牌。这对于速度来说非常好 - 节省了将每个令牌复制到其他内存区域,同时仍然可以方便地将其作为单独的NUL终止序列进行访问。这是一个有趣的问题,在std::string实例上使用strtok是否合法 - 当然,c_str()成员返回const char*因为你不打算写一些缓冲区。但是,只要您没有空字符串(它会给出未定义的行为),您就可以使用char*获得&line[0]到第一个元素。完成后,您可以改变字符串,但只能在偏移量[0]..[size()-1] ... ...不能保证NUL以c_str() - 返回的缓冲区的方式终止,正是因为{{1} 1}} - 返回的缓冲区可能不适合&line[0]使用。你可以追加一个NUL(即strtok - NUL是合法的line += '\0'内容),但它会使代码变得有点笨拙和难以维护,如果你'你可能需要删除NUL重新计划将原始值用于任何事情。

如果您真的想使用std::string,最好先将数据复制到单独的可写NUL终止缓冲区。例如:

strtok

您可以使用char* p = strdup(line.c_str()); ... use strtok on p ... free(p); ,智能指针,alloca()来最大程度地减少内存泄漏的可能性。 (我没有看到任何特别的理由更喜欢上面的C ++ std::vector<char>new - 无论如何你都使用delete但是如果你有智能指针库那么期望它去吧)。

所有这一切,找到另一种机制 - 就像那些提升机制 - 是一个更好的选择。我猜这些替代方案在您的问题评论中发布的链接chris中讨论过....