我对 C++ 比较陌生,但我仍在掌握 C++ 标准库。为了帮助从 C 转换,我想std::string
使用 printf 样式格式化程序格式化 a。我意识到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;
}
这行得通,有点。我不确定的几件事是:
- 我是否需要为空终止符腾出空间,还是没有必要?
capacity()
在这里调用正确的函数吗?我一直在想length()
会返回 0,因为字符串中的第一个字符是 a'\0'
。
偶尔在将此字符串的内容写入套接字时(使用它的c_str()
and length()
),我在接收端弹出空字节,这引起了一些悲伤,但它们似乎不一致。如果我根本不使用此功能,则不会出现空字节。