char *strtok(char *s1, const char *s2)
如何根据string
的要求将strtok
转换为字符*?我做了
for (string line; getline(sourceFile, line);) {
tokens = strtok(line.c_str(), " {};");
}
其中sourceFile
是ifstream
(sourceFile.open(filepath.c_str());
)
我得到了:
类型“const char *”的参数与“char *”
类型的参数不兼容
答案 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中讨论过....