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

jma*_*erx 0 c++ curl

我有以下代码来填充std::stringcurl get响应.

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;
}
Run Code Online (Sandbox Code Playgroud)

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

我想避免使用for循环一次添加1个字符.有没有办法做到这一点,但仍然有正确的字符串长度std::string

Tar*_*ama 5

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

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

s->tmpStr.resize(new_len + 1);
Run Code Online (Sandbox Code Playgroud)

是否有理由手动跟踪长度?你可以打电话s->tmpStr.size().