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á.