如何从包含\ 0的字符串中获取C字符串而不丢失\ 0

时间:2010-11-21 22:26:07

标签: c++ null-terminated

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

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

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

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

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

任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

嗯,myString可能在构造/分配时被截断了。您可以尝试std::basic_string::assign,它将两个迭代器作为参数,或者只使用std::vector <char>,后者在您的用例中更常用。 而你的API采用该C字符串实际上必须支持将char指针与长度一起使用。

答案 3 :(得分:0)

我有点困惑,但是:

string x("abc");
if (x.c_str()[3] == '\0')
{ cout << "there it is" << endl; }

答案 4 :(得分:0)

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

其中一个想法是否有效?

  1. 用'\ t'替换'\ 0'字符(tab char,decimal 9)。
  2. 将'\ 0'替换为一些很少使用的char值,如十进制1或十进制255。
  3. 创建转义码,比如将每个'\ 0'字符替换为编码子字符串,(如“\ 000”中的八进制)。 (务必将任何原始'\'替换为编码值(如“\ 134”))。