开发者

printf as argument of function

开发者 https://www.devze.com 2023-01-22 04:40 出处:网络
Usually usage of function: my_func(\"test\"); Whether I can use this parameter so? my_func(printf(\"current_count_%d开发者_JAVA技巧\",ad_id));

Usually usage of function:

my_func("test");

Whether I can use this parameter so?

my_func(printf("current_count_%d开发者_JAVA技巧",ad_id));

int my_func(const char *key)


Yes you can use the return value of printf as a function parameter.
But remember printf on success returns the number of characters written.
So

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

passes 6 to the foo function not bar123.

If you want to pass the string that printf prints, you can make use of sprintf function. It is similar to printf but instead of writing to the console it writes into a char array.


    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)


No; printf() returns the number of characters printed to stdout. Use s[n]printf() to create the string, then pass that.


If you're looking to pass a variable number of arguments, like printf accepts, to some function then you need to look into . To reproduce printf (for the sake of argument):

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 */
}

If you wanted to add additional arguments that aren't related to the format, add them before the 'fmt' argument. Fmt is passed to va_start to say "the variable arguments start after this one".


The function printf returns an integer.

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

Hence, you can use it in my_func as long as my_func takes an integer as parameter. This does not seem to be the case.

0

精彩评论

暂无评论...
验证码 换一张
取 消