#define FMT "%-*.*s e = %6ld, chars = %7ld, stat = %3u: %c %c %c %c\n"
该宏被传递到
printf
函数中。 %-*.*s
是什么意思?
您可以阅读 printf 的手册页。但它更像是法律文本而不是教程,所以很难理解。
我不知道
*.*
,必须自己阅读手册页。这真有趣。让我们从一个简单的printf("%s", "abc")
开始。它将打印字符串 abc
.
printf("%8s", "abc")
将打印 abc
,包括 5 个前导空格:8 是“字段宽度”。想象一个具有列宽的数据表,以便同一列中的数据垂直对齐。数据默认右对齐,适合数字。
printf("%-8s", "abc")
将打印 abc
,包括 5 个尾随空格:减号表示字段中左对齐。
重要的是,这是一个最小字段宽度:尽管字段宽度只有 8,
printf("%-8s", "1234567890")
将打印所有 10 个字符,没有任何空格。
现在是明星:
printf("%-*s", 8, "abc")
将与普通 printf("%-8s", "abc")
打印相同。星号表示字段宽度(此处:8)将作为参数传递给 printf
。这样就可以通过编程来更改它。1
现在来说说“精度”,即:
printf("%-*.10s", 8, "1234567890123")
将仅打印 1234567890
,省略最后三个字符:“精度”是字符串情况下的 最大 字段宽度。这是数据被 printf
截断的罕见情况之一(除了舍入,舍入也由精度值控制)。
最后
printf("%-*.*s", 8, 10, "1234567890123")
将打印与以前相同的内容,但最大字段宽度也作为参数给出。
1也可以将常规字符指针作为格式字符串而不是字符串文字传递。该指针可以指向在运行时组成格式字符串的缓冲区,例如使用
ssprintf
,从而实现更大的运行时灵活性。这种情况非常罕见,部分原因是 printf
的实际参数在编译时是固定的,这也主要决定了编译时的转换说明符。最有可能的是,这只是编译时未确定的字段宽度。