我有以下代码用 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/