Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C+;中的字符串中嵌入空字符+;? 我可以使用C++中支持String NULL字符的字符串吗?_C++_String_Null - Fatal编程技术网

如何在C+;中的字符串中嵌入空字符+;? 我可以使用C++中支持String NULL字符的字符串吗?

如何在C+;中的字符串中嵌入空字符+;? 我可以使用C++中支持String NULL字符的字符串吗?,c++,string,null,C++,String,Null,我的问题是: 构造具有嵌入null的字符串,并将其作为字节数组发送到C++ DLL。 string inputStr("he\0llo", 6); int byteLength = 6; BYTE *inputByte = (BYTE*)(char*)inputStr.c_str(); ApplyArabicMapping(inputByte , byteLength); 是,std::string支持存储NULL字符,因为它不以NULL结尾。您可以通过多种方式

我的问题是: 构造具有嵌入null的字符串,并将其作为字节数组发送到C++ DLL。
    string inputStr("he\0llo", 6);
    int byteLength = 6;
    BYTE *inputByte = (BYTE*)(char*)inputStr.c_str();
    ApplyArabicMapping(inputByte , byteLength);

是,
std::string
支持存储
NULL
字符,因为它不以
NULL
结尾。您可以通过多种方式创建一个:

string str("he\0llo", 6);
str.append(1, '\0');
str.push_back('\0');
const char[] cstr = "hell\0o";
string str2(cstr, cstr + sizeof(cstr) - 1); // - 1 for the NULL

是,
std::string
支持存储
NULL
字符,因为它不以
NULL
结尾。您可以通过多种方式创建一个:

string str("he\0llo", 6);
str.append(1, '\0');
str.push_back('\0');
const char[] cstr = "hell\0o";
string str2(cstr, cstr + sizeof(cstr) - 1); // - 1 for the NULL
您可以使用计数字符串,其中字符缓冲区与其“内容长度”一起存储;这允许您嵌入任何字符<例如,code>std::string,是一种计数字符串

显然,您不能将这样的字符串传递给需要经典C字符串的函数,因为它将看到它遇到的第一个null作为字符串终止符。

您可以使用计数字符串,其中字符缓冲区与其“内容长度”一起存储;这允许您嵌入任何字符<例如,code>std::string,是一种计数字符串


显然,您不能将这样的字符串传递给需要经典C字符串的函数,因为它将看到它遇到的第一个null作为字符串终止符。

您必须更清楚地了解这一点……为什么需要这样做?string类不需要
'\0'
字符就知道它的结尾。此外,如果使用string.c_str()方法,则会得到一个字符数组,该数组的末尾带有
'\0'
字符。@alegen所有这些都不会改变任何内容。通常\0表示字符串的结尾。因此,如果将中间空值的CXString()传递给一个期望空终止字符串的函数,它将不使用完整的字符串,直到第一个null。也许你需要
vector
。为什么需要这个?下投票:(它与信誉没有太大的差别),答案显然是不完整的,因为你所拥有的问题不是嵌入一个NUL字符在<代码>字符串(在C++中,它是<代码> STD::String 除非另有说明),而是使用不同的接口。也就是说,这个问题缺少最重要的信息,这些信息只是零星的评论。你必须更清楚地表达出来……你为什么需要这些?string类不需要
'\0'
字符就知道它的结尾。此外,如果使用string.c_str()方法,则会得到一个字符数组,该数组的末尾带有
'\0'
字符。@alegen所有这些都不会改变任何内容。通常\0表示字符串的结尾。因此,如果将中间空值的CXString()传递给一个期望空终止字符串的函数,它将不使用完整的字符串,直到第一个null。也许你需要
vector
。为什么需要这个?下投票:(它与信誉没有太大的差别),答案显然是不完整的,因为你所拥有的问题不是嵌入一个NUL字符在<代码>字符串(在C++中,它是<代码> STD::String 除非另有说明),而是使用不同的接口。也就是说,这个问题缺少最重要的信息,这些信息只是零星地出现在注释中。尽管这是正确的,但我想指出的是,
std::vector
在功能上几乎是一样的,它的优点是可以清楚地表明,您可能会在容器中找到您不期望的字符。@RedX:我不知道,如果它仍然是某种文本字符串,我仍然会使用
std::string
,而对二进制数据使用
std::vector
。@RedX:您可能会在容器中找到您不希望看到的字符。该语句的问题是,它假定您不应该在
std::string
中看到NUL。我相信最好是学会不去假设,然后克服它。
std::string
std::vector
之间的区别在于前者表明您存储的文本不仅仅是小数字,而且它提供了更丰富(位置太丰富)的处理功能。@AhmedMostafa:问题是您试图在接口中使用C字符串,而且C字符串不允许使用内部NUL字符(这和演员有一种奇怪的味道,请重新考虑!)。由于无法使用NUL确定字符串的结尾,因此必须传递指向第一个字符的指针和完整字符串的长度(您似乎正在这样做),并使用库中的长度忽略C字符串终止符。顺便说一句,你确定你的问题不在其他地方吗?喜欢演员吗?(或者特别是
(BYTE)
,那可能是
BYTE*
?)@DavidRodríguez dribeas有人可能会说,使用
std::vector
也表示你在存储字符;我(和许多其他人)会使用
std::vector
来表示小整数。尽管如此,
std::string
似乎确实暗示了某种实际文本,而
std::vector
只暗示了很多字符。我会使用
std::string
作为文本,除非有特别的理由不这样做,即使在实践中,我从来不会使用任何不适合
std::vector
的东西,我想指出的是,
std::vector
在功能上几乎相同,它的优点是可以清楚地表明,您可能会在容器中找到您不希望看到的字符。@RedX:我不知道,如果它仍然是某种文本字符串,我仍然会使用
std::string
,当对二进制数据使用
std::vector
时。@RedX:您可能会在容器中找到不需要的字符。该语句的问题在于它假定您不应该在
std::string
中使用NUL。我相信最好是学会不去假设,然后克服它。
std::string
std::vector
之间的区别是