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

strtok(): convert string to char*

本文关键字:转换 char 字符串 strtok      更新时间:2023-10-16

可能的重复:
在C

中拆分字符串
char *strtok(char *s1, const char *s2)

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

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

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

我得到了:

类型" const char *"类型的参数与类型" char *"的参数不兼容

正如其他人所说的,您可能想使用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);
}

如果您做这样的事情:

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++分裂字符串的方式。

正如乔纳森·莱夫勒(Jonathan Leffler)的评论所解释的那样,Strtok实际上修改了适当的缓冲区以终止连续令牌。这非常适合速度 - 保存将每个令牌复制到其他一些内存区域,同时仍然可以使您方便地访问它作为单独的NUL端序列。在std::string实例上使用strtok是否合法是一个有趣的问题 - 当然,c_str()成员返回const char*,因为您并不是要在该缓冲区的某些部分上写入。但是,只要您没有一个空字符串(为其提供不确定的行为),就可以将char*带到使用&line[0]的第一个元素。完成此操作后,您可以突变字符串,但只有在[0]..[size()-1]的偏移量中...不能按照c_str()-返回缓冲液的方式终止NUL,这正是因为&line[0]返回的缓冲区可能不适合使用由strtok。您可以附加一个nul(即 line += '' -nul是合法的 std::string内容),但是它会使代码有些骇人听闻,并且更难维护,并且如果您计划使用原始值来使用原始值,则可能需要删除NUL任何东西。

如果您真的想使用strtok,则最好先将数据复制到单独的可写的NUL端接缓冲区。例如:

char* p = strdup(line.c_str());
... use strtok on p ...
free(p);

您可以使用alloca(),智能指针,std::vector<char>来最大程度地减少内存泄漏的可能性。(对于上述内容,我看不到任何特定的理由更喜欢C newdelete-无论如何您都在使用strtok,但是如果您已经有了智能的销售库,那么它可以预见它。)。

所有话说,找到另一种机制 - 像Boost中的机制一样 - 是一个更好的选择。我猜想这样的替代方案在克里斯在您的问题下的评论中发布的链接中讨论了..