我有以下代码用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
?
答案 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
。