strtok():将字符串转换为char*
strtok(): convert string to char*
可能的重复:
中拆分字符串
在C
char *strtok(char *s1, const char *s2)
如何根据strtok
的要求将string
转换为char*?我做了
for (string line; getline(sourceFile, line);) {
tokens = strtok(line.c_str(), " {};");
}
其中sourceFile
是ifstream
(sourceFile.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 new
和delete
-无论如何您都在使用strtok
,但是如果您已经有了智能的销售库,那么它可以预见它。)。
所有话说,找到另一种机制 - 像Boost中的机制一样 - 是一个更好的选择。我猜想这样的替代方案在克里斯在您的问题下的评论中发布的链接中讨论了..
- 将无符号char*转换为std::istream*C++
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 使用char类型将decimal转换为string,将string转换为decimal
- 如何在对<char>C++程序进行逆向工程的同时将 std::basic_string 转换为 Rust 可读值?
- 将函数参数"const char*"转换为"std::string_view"是
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- C ++如何在使用"tolower"时将char转换为int
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 转换char*时的值不同
- Boost Python 不会自动转换 char* 数据成员
- 除了转换char*之外,还有更好的方法来获得一个变量值吗?
- 如何跨平台转换char*到long long(64位)
- 用atof转换char数组中的浮点数
- C转换char[]为时间戳;