我对C++比较陌生,我仍然在掌握C++标准库.为了帮助从C转换,我想格式化一个std::string使用printf风格的格式化程序.我意识到这stringstream是一种更加类型安全的方法,但我发现自己发现printf风格更容易阅读和处理(至少,暂时).这是我的功能:
using namespace std;
string formatStdString(const string &format, ...)
{
va_list va;
string output;
size_t needed;
size_t used;
va_start(va, format);
needed = vsnprintf(&output[0], 0, format.c_str(), va);
output.resize(needed + 1); // for null terminator??
va_end(va);
va_start(va, format);
used = vsnprintf(&output[0], output.capacity(), format.c_str(), va);
// assert(used == needed);
va_end(va);
return output;
}Run Code Online (Sandbox Code Playgroud)
这很有效.我不确定的一些事情是:
capacity()在这里打电话是正确的功能吗?我一直在想length(),因为字符串中的第一个字符是a,所以会返回0 '\0'.偶尔在将这个字符串的内容写入套接字(使用它的c_str()和length())时,我在接收端弹出了空字节,这引起了一些悲伤,但它们看起来似乎不一致.如果我根本不使用此函数,则不会出现空字节.