reserve() 设置字符串的容量,而不是其大小。两种不同的东西。 容量 是分配了多少内存来保存字符。 size 是分配的内存中实际有效的字符数。
shrink_to_fit() 缩小 容量 以匹配当前 大小。但是您的字符串的 size 始终为 0,因此无论您是否调用 shrink_to_fit(),该字符串实际上都是空的,没有损坏。打印std::string 会打印最多其大小的字符,而不是其容量。
你需要使用resize()而不是reserve(),例如:
std::string buf;
buf.resize(100);
//example of the function that can write to a buffer with 10-100 characters.
strcpy(&buf[0], "Hello");
buf.resize(strlen(buf.c_str()));
buf.shrink_to_fit();
std::cout << buf << std::endl;
话虽如此,shrink_to_fit() 不是必需 做任何事情,它是实现定义的。您可以考虑使用单独的缓冲区将字符读入,然后从该缓冲区构造您的 std::string,例如:
std::array<char, 100> buf;
//example of the function that can write to a buffer with 10-100 characters.
strcpy(buf.data(), "Hello");
std::string str(buf.data(), strlen(buf.data()));
std::cout << str << std::endl;
或者,在 C++17 及更高版本中,您可以改用std::string_view,例如:
std::array<char, 100> buf;
//example of the function that can write to a buffer with 10-100 characters.
strcpy(buf.data(), "Hello");
std::string_view sv(buf.data(), strlen(buf.data()));
std::cout << sv << std::endl;