我目前有一个非常庞大的字符串。我需要将它转换为C字符串(char *),因为我想要使用的函数只在参数中使用C字符串。
我的问题是,我尝试的任何东西都使得最终的C字符串比原始字符串小,因为我的字符串包含许多\ 0。那些\ 0是必不可少的,所以我不能简单地删除它们:( ...
我尝试了各种方法,但最常见的是:
myString.c_str();
myString.data();
不幸的是,C字符串始终只是第一个\ 0之前的原始字符串的内容。
任何帮助将不胜感激!
答案 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'字符?
其中一个想法是否有效?