使用memcpy填充std字符串不会设置长度

时间:2015-06-10 13:08:09

标签: c++ curl

我有以下代码用curl get响应填充std::string

struct curl_string {
    std::string tmpStr;
    size_t len;
};

void init_string(struct curl_string *s) {
    s->len = 0;
}

size_t writefunc(void *ptr, size_t size, size_t nmemb, struct curl_string *s)
{
    size_t new_len = s->len + size*nmemb;
    s->tmpStr.reserve(new_len + 1);

    memcpy(&s->tmpStr[0] + s->len, ptr, size*nmemb);
    s->tmpStr[new_len] = '\0';
    s->len = new_len;

    return size*nmemb;
}

问题是,即使我保留了正确的长度,当我尝试读回字符串时,大小仍为0.

我想避免使用for循环一次添加1个字符。有没有办法做到这一点,但在std::string

中仍然有正确的字符串长度

2 个答案:

答案 0 :(得分:5)

你的问题是std::string::reserve只保留额外字符的内存,但实际上并没有改变字符串的长度。修改底层缓冲区时,不会重新计算大小,因为在所有情况下都几乎不可能检测到。

解决方案是使用resize代替reserve

s->tmpStr.resize(new_len + 1);

是否有理由手动跟踪长度?您只需拨打s->tmpStr.size()即可。

答案 1 :(得分:0)

要将旧字符串添加到std :: string中,您可以使用3种类型的成员函数。

如果您想要替换,assign更好:

std::string str = "old text";
str.assign("new text", 8); // you can eliminate length
// str become "new text"

如果要插入字符串的结尾,append更好:

std::string str = "old text";
str.append(" new text", 9); // you can eliminate length
// str become "old text new text"
顺便说一下, 如果您的数据可能包含二进制, 我建议std::vector<char>而不是std::string