我目前有一个非常大的字符串。我需要将其转换为 C 字符串 (char*),因为我要使用的函数仅在参数中采用 C 字符串。
我的问题是,我尝试过的任何事情都会使最终的 C 字符串变得比原始字符串小,因为我的字符串包含许多 \0。那些 \0 是必不可少的,所以我不能简单地删除它们:(...
我尝试了各种方法,但最常见的是:
myString.c_str();
myString.data();
不幸的是,C 字符串始终只是第一个 \0 之前的原始字符串的内容。
任何帮助将不胜感激!
我目前有一个非常大的字符串。我需要将其转换为 C 字符串 (char*),因为我要使用的函数仅在参数中采用 C 字符串。
我的问题是,我尝试过的任何事情都会使最终的 C 字符串变得比原始字符串小,因为我的字符串包含许多 \0。那些 \0 是必不可少的,所以我不能简单地删除它们:(...
我尝试了各种方法,但最常见的是:
myString.c_str();
myString.data();
不幸的是,C 字符串始终只是第一个 \0 之前的原始字符串的内容。
任何帮助将不胜感激!
您不能创建包含'\0'
字符的 C 字符串,因为根据定义,C 字符串是一个以字符结尾的字符序列'\0'
(也称为“零结尾字符串”),因此'\0'
序列中的第一个字符结束字符串。
但是,有些接口采用指向第一个字符的指针和字符序列的长度。这些可能能够处理字符序列,包括'\0'
.
注意myString.data()
,因为这会返回一个指向可能不是以零结尾的字符序列的指针,而mystring.c_str()
总是返回一个以零结尾的 C 字符串。
这是不可能的。null 是一个以 null 结尾的字符串的结尾。如果您查看您的字符缓冲区(使用&myString[0]
),您会发现 NULL 仍然存在。但是,没有 C 函数会正确解释这些 NULL,因为 NULL 不是 C 中字符串中间的有效值。
好吧,myString
可能在构造/分配时被截断了。您可以尝试std::basic_string::assign
将两个迭代器作为参数或简单地使用std::vector <char>
,后者在您的用例中更常见。并且您的 API 采用该 C 字符串实际上必须支持采用 char 指针和长度。
我有点困惑,但是:
string x("abc");
if (x.c_str()[3] == '\0')
{ cout << "there it is" << endl; }
这可能无法满足您的需求,您确实说过“那些 \0 是必不可少的”,但是转义或替换 '\0' 字符怎么样?
这些想法之一会奏效吗?