c++ - 用 memcpy 填充标准字符串不会设置长度

标签 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 中的字符串长度仍然正确?

最佳答案

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

解决方案是只使用 resize 而不是 reserve:

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

是否有手动跟踪长度的原因?您可以只调用 s->tmpStr.size()

关于c++ - 用 memcpy 填充标准字符串不会设置长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30757300/

相关文章:

c++ - 在 C++ 中使用 'cin' 使数组与输入一样大

php - 如何让 php 的curl 接受 SSLv3?

linux - 重定向 curl 后获取最终 URL

json - 如何将单引号转义成双引号转成单引号

php - 创建 PHP API : Checking from which server the API Request comes from

c++ - VTBL 是否包含指向非虚函数的指针?

c++ - 什么时候对流类型使用 std::swap?

c++ - cv::calibrateCamera 的 "acceptable"返回值是什么?

php - Facebook:OAuthException:此授权码已被使用

c++ - cURL 条件终止下载