2

我目前有一个非常大的字符串。我需要将其转换为 C 字符串 (char*),因为我要使用的函数仅在参数中采用 C 字符串。

我的问题是,我尝试过的任何事情都会使最终的 C 字符串变得比原始字符串小,因为我的字符串包含许多 \0。那些 \0 是必不可少的,所以我不能简单地删除它们:(...

我尝试了各种方法,但最常见的是:

myString.c_str();
myString.data();

不幸的是,C 字符串始终只是第一个 \0 之前的原始字符串的内容。

任何帮助将不胜感激!

4

5 回答 5

8

您不能创建包含'\0'字符的 C 字符串,因为根据定义,C 字符串是一个以字符结尾的字符序列'\0'(也称为“零结尾字符串”),因此'\0'序列中的第一个字符结束字符串。

但是,有些接口采用指向第一个字符的指针字符序列的长度。这些可能能够处理字符序列,包括'\0'.

注意myString.data(),因为这会返回一个指向可能不是以零结尾的字符序列的指针,而mystring.c_str()总是返回一个以零结尾的 C 字符串。

于 2010-11-21T22:29:20.690 回答
3

这是不可能的。null 是一个以 null 结尾的字符串的结尾。如果您查看您的字符缓冲区(使用&myString[0]),您会发现 NULL 仍然存在。但是,没有 C 函数会正确解释这些 NULL,因为 NULL 不是 C 中字符串中间的有效值。

于 2010-11-21T22:30:41.327 回答
0

好吧,myString可能在构造/分配时被截断了。您可以尝试std::basic_string::assign将两个迭代器作为参数或简单地使用std::vector <char>,后者在您的用例中更常见。并且您的 API 采用该 C 字符串实际上必须支持采用 char 指针和长度。

于 2010-11-21T22:30:23.380 回答
0

我有点困惑,但是:

string x("abc");
if (x.c_str()[3] == '\0')
{ cout << "there it is" << endl; }
于 2010-11-21T22:31:59.610 回答
0

这可能无法满足您的需求,您确实说过“那些 \0 是必不可少的”,但是转义或替换 '\0' 字符怎么样?

这些想法之一会奏效吗?

  1. replace the '\0' chars with a '\t' (tab char, decimal 9).
  2. replace the '\0' with some rarely used char value like decimal 1, or decimal 255.
  3. Create an escape code, say by replacing each '\0' char with a coded substring, (like octal as in "\000"). (Be sure to replace any original '\' with a coded value as well (like "\134")).
于 2010-11-21T23:18:45.187 回答