Jak*_*ake 2 c++ stdstring lpcstr
如何在保留'\ 0'字符的同时将std :: string转换为LPCSTR?
我想在OPENFILENAME.lpstrFilter上使用结果,该结果要求过滤器包含'\ 0'作为分隔符.
std :: string.c_str()似乎剥离和修剪'\ 0'
提前致谢!
==========================
(如何在论坛中正确添加评论,如回复帖?)
看完你的评论后,我继续仔细检查这个片段:
std::string filter = "Terrain Configuration (*.tcfg)\0*.tcfg\0\0";
const char* f1 = "Terrain Configuration (*.tcfg)\0*.tcfg\0\0";
const char* f2 = filter.c_str();
for(int i = 0; i < 50; i++)
{
char c1 = *(f1 + i); // works
char c2 = *(f2 + i); // doesn't work. beyond the first \0, it's garbage.
}
Run Code Online (Sandbox Code Playgroud)
我错误地认为c_str()或LPCSTR是如何工作的?
一般来说,std :: string正确处理嵌入的'\ 0'字符.
但是,当与const char*连接时,必须非常小心.
在这种情况下,在构造字符串期间已经出现问题:
std::string filter = "Terrain Configuration (*.tcfg)\0*.tcfg\0\0"; // wrong
Run Code Online (Sandbox Code Playgroud)
在这里,您从const char*构造一个std :: string.由于构造函数不知道用于构造std :: string的字符数,因此它会在第一个'\ 0'处停止.
可以自己逐个复制字符,但有一种更好的方法:使用需要两个迭代器到char数组的构造函数,一个使用begin,另一个使用end:
const char filter_[] = "Terrain Configuration (*.tcfg)\0*.tcfg\0\0";
std::string filter(filter_, filter_ + sizeof(filter_));
Run Code Online (Sandbox Code Playgroud)
它看起来很糟糕,但希望你不会经常在你的代码中这样做.
更新:或者使用begin()和end()模板的适当定义(根据James Kanze的评论):
const char filter_[] = "Terrain Configuration (*.tcfg)\0*.tcfg\0\0";
std::string filter(begin(filter_), end(filter_));
Run Code Online (Sandbox Code Playgroud)