printf string, variable length item

前端 未结 2 1628
独厮守ぢ
独厮守ぢ 2020-11-28 07:11
#define SIZE 9
int number=5;
char letters[SIZE]; /* this wont be null-terminated */
... 

char fmt_string[20];
sprintf(fmt_string, \"%%d %%%ds\", SIZE);
/* fmt_strin         


        
相关标签:
2条回答
  • 2020-11-28 08:03

    There is no need to construct a special format string. printf allows you to specify the precision using a parameter (that precedes the value) if you use a .* as the precision in the format tag.

    For example:

    printf ("%d %.*s", number, SIZE, letters);
    

    Note: there is a distinction between width (which is a minimum field width) and precision (which gives the maximum number of characters to be printed). %*s specifies the width, %.s specifies the precision. (and you can also use %*.* but then you need two parameters, one for the width one for the precision)

    See also the printf man page (man 3 printf under Linux) and especially the sections on field width and precision:

    Instead of a decimal digit string one may write "*" or "*m$" (for some decimal integer m) to specify that the precision is given in the next argument, or in the m-th argument, respectively, which must be of type int.

    0 讨论(0)
  • 2020-11-28 08:09

    A somewhat unknown function is asprintf. The first parameter is a **char. This function will malloc space for the string so you don't have to do the bookkeeping. Remember to free the string when done.

    char *fmt_string;
    
    asprintf(&fmt_string, "%%d %%%ds", SIZE);
    printf(fmt_string, number, letters);
    free(fmt_string);
    

    is an example of use.

    0 讨论(0)
提交回复
热议问题