sprintf напрямую в std :: string? - PullRequest
3 голосов
/ 06 января 2012

Меня интересует (по разным причинам) форматирование с использованием sprintf с результатом в std::string объекте.Самый синтаксически прямой способ, которым я придумал, это:

char* buf;
sprintf(buf, ...);
std::string s(buf);

Есть еще идеи?

Ответы [ 3 ]

7 голосов
/ 06 января 2012

Не используйте строку функций printf для форматирования в C ++.Используйте языковую особенность потоков (в данном случае - stringstream), которые являются безопасными по типу и не требуют от пользователя предоставления символов специального формата.

Если вы действительно действительно хотите сделать это,Вы можете предварительно выделить достаточно места в вашей строке и затем изменить ее размер, хотя я не уверен, что это более эффективно, чем использование временного массива буферов:

std::string foo;
foo.resize(max_length);
int num_bytes = snprintf(&foo[0], max_length, ...);
if(num_bytes < max_length)
{
    foo.resize(num_bytes);
}
1 голос
/ 06 января 2012

Если вы абсолютно хотите использовать sprintf, нет более прямого пути, чем тот, который вы написали.

sprintf Записывает в массив, указанный str a Cstring

Если вы хотите преобразовать это C string в std::string, нет лучшего и более безопасного способа, чем тот, который вы написали.

0 голосов
/ 28 сентября 2015

ответил здесь . Чтобы получить необходимую длину буфера, позвоните:

snprintf( nullptr, 0, format, args... )

Вы можете написать короткую функцию, которую можно использовать так:

std::string s = string_sprintf("%g, %g\n", 1.23, 0.001);

Пример в связанном ответе stackoverflow.

...