#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_string = "%d %9d"... or it should be */
printf(fmt_string, number, letters);
有更好的做法吗?
不需要构造特殊的格式字符串。如果在格式标记中使用.*
作为精度,并将其作为参数(在值之前)进行指定,printf
即可允许您指定该精度。
例如:
printf ("%d %.*s", number, SIZE, letters);
注意:宽度(即最小字段宽度)和精度(即要打印的最大字符数)是有区别的。
%*s
指定宽度,%.s
指定精度。(你也可以使用%*.*
,但这需要两个参数,一个用于宽度,一个用于精度。)man 3 printf
),特别是有关字段宽度和精度的部分:
可以写"*"或"*m$"(对于某个十进制整数m)代替十进制数字字符串,以指定下一个参数或第m个参数中给出精度,这些参数必须为int类型。
"%*.*s"
,分别表示最小长度和最大长度,用于控制字母的输出。 - ott--"*m$"
不是标准的 C 语言。 - chux - Reinstate Monicasize_t
而不是int
? - Jimmay一个比较不为人知的函数是asprintf
。第一个参数是**char
。该函数将malloc
字符串所需的空间,因此您无需进行簿记。完成后,请记得free
字符串。
char *fmt_string;
asprintf(&fmt_string, "%%d %%%ds", SIZE);
printf(fmt_string, number, letters);
free(fmt_string);
sprintf
返回的字符串赋值给fmt_string
,而且fmt_string
不应该在参数列表中。 - paviumletters
不会以 NULL 结尾,有什么特别的原因吗? - Andrew Keeton