Строка сборки как в функции printf - PullRequest
5 голосов
/ 01 апреля 2012
printf("%d.%d.%d", year, month, day);

Могу ли я сделать то же самое, но без печати, что-то вроде

char* date = "%d.%d.%d", year, month, day;

Или, может быть, есть другие простые способы сделать это?

Ответы [ 5 ]

6 голосов
/ 01 апреля 2012

В обычном c есть asprintf (), который выделит память для хранения результирующей строки:

#include <stdio.h>
char *date;
asprintf(&date, "%d.%d.%d", year, month, day);

(обработка ошибок опущена)

Поскольку вы пометили C ++, вы, вероятно, захотитеиспользуйте решения C ++.

2 голосов
/ 01 апреля 2012

В C ++:

#include <string>

std::string date = std::to_string(year) + '.' +
                   std::to_string(month) + '.' + std::to_string(day);

Если вам нужен базовый char const *, скажем date.c_str().

Функция std::to_string использует snprintf внутренне;вам, вероятно, следует поискать и эту функцию, поскольку она довольно важна для форматированного вывода, и вы можете использовать ее напрямую, если действительно считаете, что вам это нужно.

1 голос
/ 31 мая 2017

В C ++ я написал функцию для создания строк в формате printf.

Заголовочный файл stringf.h :

#ifndef STRINGF_H
#define STRINGF_H

#include <string>

template< typename... argv >
std::string stringf( const char* format, argv... args ) {
    const size_t SIZE = std::snprintf( NULL, 0, format, args... );

    std::string output;
    output.resize(SIZE+1);
    std::snprintf( &(output[0]), SIZE+1, format, args... );
    return std::move(output);
}

#endif

Использование:

#include "stringf.h"

int main(){
    int year = 2020;
    int month = 12;
    int day = 20
    std::string date = stringf("%d.%d.%d", year, month, day);
    // date == "2020.12.20"
}
1 голос
/ 01 апреля 2012

Существуют различные реализации функции 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 дважды, сначала без буфера, чтобы получить длину отформатированной строки, затем выделить объект строки с нужной емкостью, а затем вызвать второй раз, чтобы получить строку. Это позволяет избежать выделения памяти дважды, но необходимо выполнить два прохода через отформатированную строку.

0 голосов
/ 01 ноября 2016

На языке C используйте функцию sprintf из заголовочного файла stdio.h.

char  buffer[100];
sprintf(buffer,"%d.%d.%d", year, month, day);

См. здесь для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...