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

Soy relativamente nuevo en C ++ y todavía me estoy familiarizando con la Biblioteca estándar de C ++. Para ayudar a la transición desde C, quiero formatear unstd::string utilizando formateadores de estilo printf. me doy cuentastringstream es un enfoque más seguro para los tipos, pero creo que encontrar el estilo printf es mucho más fácil de leer y manejar (al menos por el momento). Esta es mi función:


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

Esto funciona, un poco. Algunas cosas de las que no estoy seguro son:

¿Necesito dejar espacio para un terminador nulo o es innecesario?Escapacity() la función correcta para llamar aquí? Sigo pensandolength() devolvería 0 ya que el primer carácter de la cadena es un'\0'.

Ocasionalmente mientras escribe el contenido de esta cadena en un socket (usando suc_str() ylength()), Tengo bytes nulos apareciendo en el extremo receptor, lo que está causando un poco de pena, pero parecen aparecer de manera inconsistente. Si no uso esta función, no aparecen bytes nulos.

Respuestas a la pregunta(7)

Su respuesta a la pregunta