Существуют различные реализации функции format
, которая выглядит примерно так:
std::string format(const std::string& fmt, ...);
ваш пример будет таким:
std::string date = format("%d.%d.%d", year, month, day);
Одна из возможных реализаций показана ниже.
Boost имеет библиотеку форматов , которая работает немного по-другому. Предполагается, что вам нравятся cin
, cout
и их аналог:
cout << boost::format("%1%.%2%.%3%") % year % month % day;
Или, если вы просто хотели строку:
boost::format fmt("%1%.%2%.%3%");
fmt % year % month % day;
std::string date = fmt.str();
Обратите внимание, что %
флаги не те, к которым вы привыкли.
Наконец, если вам нужна строка C (char*
) вместо C ++ string
, вы можете использовать функцию asprintf
:
char* date;
if(asprintf(&date, "%d.%d.%d", year, month, day) == -1)
{ /* couldn't make the string; format was bad or out of memory. */ }
Вы даже можете использовать vasprintf
, чтобы создать собственную format
функцию, возвращающую строку C ++:
std::string format(const char* fmt, ...)
{
char* result = 0;
va_list ap;
va_start(ap, fmt);
if(vasprintf(*result, fmt, ap) == -1)
throw std::bad_alloc();
va_end(ap);
std::string str_result(result);
free(result);
return str_result;
}
Это не очень эффективно, но работает. Также может быть способ вызвать vsnprintf
дважды, сначала без буфера, чтобы получить длину отформатированной строки, затем выделить объект строки с нужной емкостью, а затем вызвать второй раз, чтобы получить строку. Это позволяет избежать выделения памяти дважды, но необходимо выполнить два прохода через отформатированную строку.