printf как аргумент функции - PullRequest
       30

printf как аргумент функции

3 голосов
/ 26 октября 2010

Обычно использование функции:

my_func("test");

Могу ли я использовать этот параметр так?

my_func(printf("current_count_%d",ad_id));

int my_func (const char * key)

Ответы [ 5 ]

8 голосов
/ 26 октября 2010

Да, вы можете использовать возвращаемое значение printf в качестве параметра функции.
Но помните, printf в случае успеха возвращает количество написанных символов.
Итак

foo(printf("bar%d",123)); 

передает 6 в функцию foo, а не bar123.

Если вы хотите передать строку, которую печатает printf, вы можете использовать функцию sprintf. Он похож на printf, но вместо записи в консоль записывает в массив char.

4 голосов
/ 26 октября 2010
    char buf[64]; /* malloc or whatever */
    int pos = snprintf(buf, sizeof(buf), "current_count_%d", ad_id);
    if (sizeof(buf) <= pos)
                    buf[sizeof(buf)-1] = '\0';
    my_func(buf)
2 голосов
/ 26 октября 2010

Нет; printf() возвращает количество символов, напечатанных на стандартный вывод. Используйте s[n]printf() для создания строки, затем передайте ее.

1 голос
/ 26 октября 2010

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

void varargfunc(char *fmt, ...)
{
    char formattedString[2048]; /* fixed length, for a simple example - and
                                   snprintf will keep us safe anyway */
    va_list arguments;

    va_start(arguments, fmt); /* use the parameter before the ellipsis as
                                 a seed */

    /* assuming the first argument after fmt is known to be an integer,
       you could... */
    /*
        int firstArgument = va_arg(arguments, int);
        fprintf(stderr, "first argument was %d", firstArgument);
    */

    /* do an vsnprintf to get the formatted string with the variable
       argument list. The v[printf/sprintf/snprintf/etc] functions
       differ from [printf/sprintf/snprintf/etc] by taking a va_list
       rather than ... - a va_list can't turn back into a ... because
       it doesn't inherently know how many additional arguments it
       represents (amongst other reasons) */
    vsnprintf(formattedString, 2048, fmt, arguments);

    /* formattedString now contains the first 2048 characters of the
       output string, with correct field formatting and a terminating
       NULL, even if the real string would be more than 2047 characters
       long. So put that on stdout. puts adds an additional terminating
       newline character, so this varies a little from printf in that 
       regard. */
    puts(formattedString);

    va_end(arguments); /* clean up */
}

Если вы хотите добавить дополнительные аргументы, не связанные с форматом, добавьте их перед аргументом 'fmt'. Fmt передается в va_start, чтобы сказать «аргументы переменной начинаются после этого».

1 голос
/ 26 октября 2010

Функция printf возвращает целое число .

int printf ( const char * format, ... );

Следовательно, вы можете использовать его в my_func, пока my_func принимает целое число в качестве параметра.Похоже, это не так.

...