我有一个需要存储const char *的结构供以后使用。那时字符串就被破坏了。到目前为止我所拥有的代码是
HttpRequest* send(string reply)
{
int len = strlen(reply.c_str());
char *buffer = new char[len+1];
strncpy(buffer, reply.c_str(), len);
cout << "LEN:"<<reply.length()<<endl;
cout << "OG:"<<reply<<endl<<"TC:"<<buffer<<endl<<"CS"<<reply.c_str()<<endl;
this->res.response = "test";
return this;
};
res.response
是我想要存储值的char *。我得到的cout的输出是
LEN:5
OG:hello
TC:hello�������������������q{
CShello
这种行为对我来说很奇怪。有人可以解释一下我做错了什么。此外,上面的代码显示我使用strlen
,但我也在c ++中使用length()
获得相同的结果。
另外值得一提的是,这只是在我第一次调用它时才会发生,之后就可以了。
答案 0 :(得分:8)
你永远不会把空终结符:
char *buffer = new char[len+1];
strncpy(buffer, reply.c_str(), len);
buffer[len] = 0; // <-- HERE
strncpy
无法添加。
答案 1 :(得分:3)
你对strncpy()
的参数使函数误解为没有空格来终止null-character,所以它没有被写入。纠正像
strncpy(buffer, reply.c_str(), len+1);
在此代码中,保证缓冲区的长度足以存储字符串,因此您只需使用strcpy()
代替strncpy()
,如下所示:
strcpy(buffer, reply.c_str());
如果您的系统支持,您可以使用strdup()
功能。使用它,行
int len = strlen(reply.c_str());
char *buffer = new char[len+1];
strncpy(buffer, reply.c_str(), len);
可以替换为
char *buffer = strdup(reply.c_str());
请注意,strdup()
是来自C的函数,它在内部使用malloc()
,因此您必须使用free()
而不是delete[]
来释放通过{strdup()
分配的内存1}}。
答案 2 :(得分:1)
在您阅读并了解其文档之前,请勿使用strncpy
。然后不要使用它。这是一个非常专业的功能,没有必要在这里处理它的怪癖。问题中的代码为结果分配了足够的空间,因此只需使用strcpy
。
答案 3 :(得分:1)
问题是这句话
strncpy(buffer, reply.c_str(), len);
不会将原始字符串的终止零('\ 0')复制到buffer
。
仅当对象包含嵌入的零时,才应将标准C函数strlen
与std::string
类型的对象一起使用。否则,请使用班级std::string
size
或length
的成员函数。
您可以使用标准C函数strncpy
来复制缓冲区中以零结尾的字符串,而不是标准C函数strcpy
。
例如
char *buffer = new char[len+1];
strcpy( buffer, reply.c_str() );