printf中的“.”是什么意思?

12

我正在阅读经典的K&R,并遇到以下语法:

printf("%.*s",max,s);

这里的"."代表什么意思?如果我不使用".",则会打印整个字符串,但当我们不使用"."时,最多只会打印最大字符数。如果有人能解释一下,我将非常感激。

1
你读过C标准吗?它规定了这应该如何工作... - DCoder
3
@DCoder,我曾经与C标准打交道很多,我敢肯定它是不可能被“读取”的。 - Nikolai Ruhe
@NikolaiRuhe:对于标准的某些部分来说可能是真的,但我发现描述printf的部分非常易读。 - DCoder
3
忽略标准,man printf 在大多数机器上提供了良好的描述。 - amrith
2
请注意,在StackOverflow上,一旦问题得到提问者的满意解决,他或她应该接受最佳答案。这样做的目的是为了向花时间编写答案的志愿者提供象征性的奖励,并为未来的访问者提供由提问者评判的最正确的解决方案的见解。 - user4815162342
Plonk。如果 OP 接受了其中一个答案,那该多好啊。已经快四个月了。唉。我能给用户点踩吗?8O - TheBlastOne
6个回答

13
%.*s中,.*限制了将要写入的字节数。如果使用数字编写,例如%.34s,那么数字就是限制。当使用星号时,限制来自于printf的相应参数。
来自C 2011(N1570)7.21.6.1 4,描述fprintf et al 的转换说明:
可选精度给出 conversions的最大写入字节数。精度采用句点(.)后跟星号 * (稍后描述)或可选十进制整数的形式; 如果只指定了句点,则精度被视为零。

你可能想要这样写:“在 %.*s 中,部分 .* 限制了……”,否则读起来会有些困难。 - Veltas
我会用“整数”或“数字”来替换“numeral”。 - Veltas
@Veltas:谢谢,我在.*之前插入了“the”。关于数字和数值,整数和数字都是数学对象。数字是指表示数字的符号(特别是数字字符串)。所以,“34”是数字,但不是数值,就像“狼”是词语,但不是动物一样。 - Eric Postpischil

13

它指定了“字符串最大字段宽度”。

字符串格式中的精度指定了最大字段宽度:

%2.6s

指定最小宽度为2,最大宽度为6个字符。如果字符串超过6个字符,则会被截断。


4

printf格式化字符串允许指定宽度和精度。

宽度,例如%25s,告诉printf将字符串填充到25个字符的宽度,在字符串前插入空格。(如果字符串宽度大于25个字符,则仍会完整打印。)

应用于字符串格式的“精度”,例如%.25s,将打印的字符串长度限制为25个字符。一个3个字符的字符串将被完全打印(没有填充),而一个30个字符的字符串将缺少其最后5个字符。

%.*s避免在格式中硬编码精度,而是将其作为整数参数指定给printf,在您的情况下为max


“Not known at the time format is written,” 这是什么意思? - Veltas
@Veltas 当你写一个格式,比如%.25s,你知道你需要25个字符的精度。当你写%.*s时,你在运行时才确定精度。我会尝试澄清答案。 - user4815162342

2
首先,K&R 是 C 的原始实现,与当前规范不同。如果您想获取有关 K&R C 的具体信息,请查阅相应的文档。
从当前的 C 标准来看:
引用:“可选精度给出(...)s 转换要写入的最大字节数。精度采用句点(.)后跟随一个星号 *(稍后将描述)或一个可选的十进制整数的形式。”

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

类似的文档在多个标准或实现的在线资源中都可以找到:

1

使用不同的格式字符串时,点号具有不同的含义。如果在%f中使用a.b,则b表示长度,a表示小数点位数。如果在%s中使用a.b,则a表示字符串的最小长度,而b表示将被打印的字符串的最大长度。


0

根据传递给printf函数的参数,它实际上以限定数量和指定格式打印字符。在这种情况下,它应该打印出"max"的具体内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接