Как добавить строку или целое число в переменную функцию printf? - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть функция отладки, которая принимает формат и переменное число дополнительных аргументов (точно так же как printf()), преобразует их в форматированную строку, хранящуюся в буфере buf, и отправляет этот буфер во вторичную функцию, которая на самом деле печатает это:

    #include <stdio.h>
    #include <stdarg.h>

    void debug_printf(const char *fmt, ...)
    {
        char buf[100];
        va_list va;

        va_start(va, fmt);

        /* Format the string and store it in buf */
        vsnprintf(buf, sizeof(buf), fmt, va);

        /* Actually print the buf. */
        actual_print(buf);

        va_end(va);
    }

Как я могу изменить эту функцию, чтобы добавить строку к полученному результату? Например, заголовок типа DBG:, поэтому, если бы я позвонил debug_printf("test1"), результат вывел бы DBG: test1.

В качестве альтернативы, как я могу изменить эту функцию, взять переменное целое число (возвращаемое значение функции) и каким-то образом добавить его в виде строки к полученному результату? Например, если бы у меня была функция rng(), которая возвращала случайное целое число, я мог бы вызвать debug_printf("test2"), и результат вывел бы что-то вроде 3572 test2, предполагая, что rng() вернул целочисленное значение 3572.

В обоих случаях в идеале решение будет модифицировать тело debug_printf(), а не заключать его в другую функцию и / или макрос препроцессора.

РЕДАКТИРОВАТЬ : Кажется, я забыл важный момент. Из соображений производительности я бы предпочел звонить только actual_printf() один раз в течение debug_printf(). В противном случае да, это было бы довольно простым решением вызвать его дважды: один раз с заголовком и снова с фактической отформатированной строкой. Извините за это!

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Выведите в буфер все, что вы хотите добавить, и все.

#include <stdio.h>
#include <stdarg.h>

void debug_printf(const char *fmt, ...)
{
    char buf[100];
    va_list va;

    va_start(va, fmt);

    int n = snprintf(buf, sizeof(buf), "DBG: ");

    /* Format the string and store it in buf */
    vsnprintf(buf + n, sizeof(buf) - n, fmt, va);

    /* Actually print the buf. */
    actual_print(buf);

    va_end(va);
}

Нет необходимости использовать фиксированный размер. В man-странице есть пример для вычисления правильного размера буфера, который нужно выделить с помощью malloc ():

http://man7.org/linux/man-pages/man3/printf.3.html

0 голосов
/ 02 ноября 2018

Вместо того, чтобы найти сложный способ вставить другой параметр в список переменных, вы можете просто добавить простой printf в начало вашего кода:
printf("%d ",rng());

...