了解 printf 格式规范中的 %03.3u

Understand %03.3u in printf format specification

本文关键字:3u 范中 printf 格式 了解      更新时间:2023-10-16

我正在使用printf来输出内容。现在我在另一个人的代码中看到格式规范为"%03.3u",根据我的理解,点之前的"03"已经将输出的宽度指定为 3 位,如果没有 3,则用零填充,而点后面的"3"也指定应该有 3 位数字输出。因此,点之前似乎有"03",点后面的"3"是重复的。

我进行以下测试:

char l[50];
sprintf(l, "%03.3u", 5);
sprintf(l, "%03u", 5);
sprintf(l, "%.3u", 5);  

并确认输出始终为005。那么为什么其他人应该使用"%03.3u"而不是"%03u"或"%.3u"呢?

对于您使用的特定,输出将是相同的。.前面的数字是最小字段宽度,而之后的数字(至少对于u转换说明符(是要输出的最小位数。您可以通过以下方式查看两者之间的区别:

printf("%3.2un", 7)

这为您提供space07- 最少两位数输出和至少三个字符宽。

但是,数字相同的事实意味着您将在至少三个字符宽的字段中至少获得三位数字。即使您使用了%03.2u(不同的最小值(,该0的存在也意味着用0而不是space左键,因此您仍然会看到005


底线是,要获得完整的三位数字,您可以使用0零键盘修饰符最小位数修饰符,但您不需要两者。

但是,由于两者兼而有之除了迫使人们质疑编写它的人的理智之外,不会产生任何不利影响:-(,因此在功能上是可以的。

03是带有零填充的字段宽度。这意味着至少要输出 3 个字符,如果少于 3个字符,则左键为零。

第二个3是要输出的最小位数

当同时指定这两个值时,将应用精度,如果结果小于最小字段宽度,则将填充输出。例如,printf("q%6.3u", 5)将产生q 005。 (我使用q因为堆栈溢出格式会吃掉空格(。

如果要打印无符号整数并且未使用符号标志,则位数与字段宽度相同(因为唯一的输出是数字(。%03u%.3u%03.3u都有相同的效果。

我猜这个人写%03.3u因为他们没有正确理解这些东西的含义,所以他们猜到了一些东西,它奏效了,他们决定不做任何进一步的改变。

如果您打印符号字符,则字段宽度与数字计数不同,例如,您可以尝试使用%+3u%+.3u。或者,如果您使用%d并打印负数。