在保留“ 0”字符时,如何将STD :: String转换为LPCSTR?

我想在openfilename.lpstrfilter上使用结果,该flptrfilter要求过滤器包含“ 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.
}

我是否误入了C_STR()或LPCSTR的工作方式?

有帮助吗?

解决方案

C_str不会剥离NUL字符。错误可能是您构造std :: string的方式。

其他提示

一般而言,std :: string正确嵌入了“ 0”字符。

但是,当与const char*接口时,必须格外小心。

在这种情况下,问题已经发生在 构造 带有以下操作的字符串

std::string filter = "Terrain Configuration (*.tcfg)\0*.tcfg\0\0"; // wrong

在这里,您可以从const char*构造一个std ::字符串。由于构造函数不知道要使用多少个字符来构造std :: string,因此它停在第一个' 0'。

一个人可以单独复制角色,但是有一个更好的方法:使用需要两个迭代器到char阵列的构造器,一个开始,一开始:

const char filter_[] = "Terrain Configuration (*.tcfg)\0*.tcfg\0\0"; 
std::string filter(filter_, filter_ + sizeof(filter_));

看起来很恐怖,但希望您不会在代码中经常这样做。

更新:或使用begin()和end()模板的适当定义(根据詹姆斯·坎兹(James Kanze)的评论):

const char filter_[] = "Terrain Configuration (*.tcfg)\0*.tcfg\0\0"; 
std::string filter(begin(filter_), end(filter_));

length() 你的 string 是您需要使用的内容来确保所有字符都包含在内 \0 人物。

LPCSTR 有效时 cString 在范围中:

#include <boost/scoped_array.hpp>
#include <string>
#include <algorithm>

string source("mystring");
boost::scoped_array<char> cString(new char[source.length() + 1]);

std::copy(source.begin(), source.end(), cString.get());
cString[source.length()] = 0;

LPCSTR rawStr = cString.get();

没有scoped_array:

#include <string>
#include <algorithm>

string source("mystring");
LPSTR rawStr = new char[source.length() + 1];

std::copy(source.begin(), source.end(), rawStr);
rawStr[source.length()] = 0;

// do the work here

delete[] rawStr;

编辑:在您的 filter init,构造函数 string 仅包括到第一个的数据 \0 char。这是有道理的 - 当数据掌握的所有数据是 const char *?尝试以下尝试:

const char f3[] = "Terrain Configuration (*.tcfg)\0*.tcfg\0\0";
std::string filter(f3, sizeof(f3));

这取决于STD :: String的进一步生命周期。

例如,您可以手动附加零终端:

std::string test("init");
test += '\0';

这会导致长度增加一个。或者只是创建另一个sTD :: String的实例,并附加了零

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top