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

Eu sou relativamente novo em C ++ e ainda estou familiarizado com a Biblioteca Padrão C ++. Para ajudar na transição de C, quero formatar umstd::string usando formatadores no estilo printf. eu percebostringstream é uma abordagem mais segura para o tipo, mas me acho muito mais fácil ler e lidar com o estilo printf (pelo menos por enquanto). Esta é a minha função:


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;
}

Isso funciona, meio que. Algumas coisas que não tenho certeza são:

Preciso abrir espaço para um terminador nulo ou isso é desnecessário?Écapacity() a função certa para ligar aqui? Eu fico pensandolength() retornaria 0, pois o primeiro caractere da string é um'\0'.

Ocasionalmente, ao gravar o conteúdo dessa string em um soquete (usando seuc_str() elength()), Tenho bytes nulos aparecendo na extremidade de recebimento, o que está causando um pouco de tristeza, mas eles parecem aparecer inconsistentemente. Se eu não usar essa função, nenhum bytes nulo aparecerá.

questionAnswers(7)

yourAnswerToTheQuestion