【问题标题】:How can i embed NULL character inside string in C++?如何在 C++ 中的字符串中嵌入 NULL 字符?
【发布时间】:2012-04-04 11:10:45
【问题描述】:

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

我的问题是: 构造带有嵌入 NULL 的字符串,因此将其作为字节数组发送到 C++ DLL。

    string inputStr("he\0llo", 6);
    int byteLength = 6;
    BYTE *inputByte = (BYTE*)(char*)inputStr.c_str();
    ApplyArabicMapping(inputByte , byteLength);

【问题讨论】:

  • 你必须比这更清楚......
  • 你为什么需要那个?字符串类不需要'\0' 字符就知道它结束了。此外,如果你使用 string.c_str() 方法,你会得到一个字符数组 '\0' 结尾。
  • @alegen 没有任何改变。
  • 通常 \0 表示字符串的结尾。因此,如果您将中间带有空值的 c_str() 传递给期望以空值终止的字符串的函数,它将不会使用完整的字符串,只会使用第一个空值。也许你需要vector<char>。为什么需要这个?
  • 拒绝投票:(它对声誉没有太大影响)答案显然不完整,因为您遇到的问题不是在 string 中嵌入 NUL 字符(在除非另有说明,否则 C++ 将是 std::string),而是使用不同的接口。也就是说,这个问题缺少最重要的信息,这些信息只散布在 cmets 中。

标签: c++ string null


【解决方案1】:

是的,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::vector<char> 在功能上几乎相同,并且具有明确您可能会在容器中找到您不期望的字符的优势。
  • @RedX:我不知道,如果它仍然是某种文本字符串,我仍然会使用std::string,而将std::vector<unsigned char> 用于二进制数据。
  • @RedX: 你可能会在容器中找到你不期望的字符 该语句的问题在于它假定你不应该在 @987654328 中期望 NUL @。我相信最好学会不要假设并克服它。 std::stringstd::vector<char> 之间的区别在于,前者表明您存储的文本不仅仅是小数字,而且它提供了更丰富(过于丰富的地方)进行处理。跨度>
  • @AhmedMostafa:问题是你试图在界面中使用 C 字符串,而 C 字符串不允许内部 NUL 字符(那和演员有一种有趣的气味,重新考虑它们!)。因为您不能使用 NUL 来确定字符串的结尾,所以您必须同时传递指向第一个字符的指针和完整字符串的长度(您似乎正在这样做)使用长度在库中忽略 C 字符串终止符。顺便说一句,您确定您的问题不在其他地方吗?喜欢演员表? (或者特别是(BYTE),可以是BYTE*吗?)
  • @DavidRodríguez-dribeas 有人可能会争辩说,使用std::vector<char> 也表示您正在存储字符;我(和许多其他人)会使用std::vector<signed char> 来表示小整数。尽管如此,std::string 似乎确实暗示了某种实际文本,而 std::vector<char> 暗示了很多字符。我会使用std::string 作为文本,除非有特殊原因不这样做,即使在实践中,我从不使用与std::vector<char> 一样好的东西。
【解决方案2】:

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

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

【讨论】:

  • @AhmedMostafa 也许你应该用你的问题更新原始问题,因为我(可能还有其他人)不明白你在评论中的意思。
猜你喜欢
  • 2020-09-14
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多