printf 格式字符串中的“%-*.*s”是什么意思?

问题描述 投票:0回答:1
#define FMT "%-*.*s e = %6ld, chars = %7ld, stat = %3u: %c %c %c %c\n"

该宏被传递到

printf
函数中。
%-*.*s
是什么意思?

c printf
1个回答
65
投票

您可以阅读 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
的实际参数在编译时是固定的,这也主要决定了编译时的转换说明符。最有可能的是,这只是编译时未确定的字段宽度。

© www.soinside.com 2019 - 2024. All rights reserved.