相关疑难解决方法(0)

std :: string.resize()和std :: string.length()

我对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)

这很有效.我不确定的一些事情是:

  1. 我是否需要为空终止符腾出空间,或者这是不必要的?
  2. capacity()在这里打电话是正确的功能吗?我一直在想length(),因为字符串中的第一个字符是a,所以会返回0 '\0'.

偶尔在将这个字符串的内容写入套接字(使用它的c_str()length())时,我在接收端弹出了空字节,这引起了一些悲伤,但它们看起来似乎不一致.如果我根本不使用此函数,则不会出现空字节.

c++ string printf c++-standard-library

2
推荐指数
2
解决办法
7502
查看次数

标签 统计

c++ ×1

c++-standard-library ×1

printf ×1

string ×1