c ++中的const char *字符串将垃圾放在最后

时间:2016-08-25 15:02:02

标签: c++ arrays string

我有一个需要存储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()获得相同的结果。

另外值得一提的是,这只是在我第一次调用它时才会发生,之后就可以了。

4 个答案:

答案 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函数strlenstd::string类型的对象一起使用。否则,请使用班级std::string sizelength的成员函数。

您可以使用标准C函数strncpy来复制缓冲区中以零结尾的字符串,而不是标准C函数strcpy

例如

    char *buffer = new char[len+1];
    strcpy( buffer, reply.c_str() );