我只是在阅读经典的 K&R 并遇到以下语法:
printf("%.*s",max,s);
这里是什么意思"."
?当我不在"."
这里应用 a 时,会打印整个字符串,但是当我们不应用 a 时"."
,最多打印最大字符。如果有人能解释这一点,我将非常感激。
我只是在阅读经典的 K&R 并遇到以下语法:
printf("%.*s",max,s);
这里是什么意思"."
?当我不在"."
这里应用 a 时,会打印整个字符串,但是当我们不应用 a 时"."
,最多打印最大字符。如果有人能解释这一点,我将非常感激。
它指定“字符串最大字段宽度”
字符串格式中的精度指定最大字段宽度:
%2.6s
指定最小宽度为 2,最大宽度为 6 个字符。如果字符串大于 6 个字符,它将被截断。
在%.*s
中,.*
限制将写入的字节数。如果这是用包含的数字编写的,例如%.34s
,那么数字将是限制。当使用星号时,限制取自 的对应参数printf
。
fprintf
从 C 2011 (N1570) 7.21.6.1 4 开始,描述et al的转换规范:
一个可选的精度,它给出了……为s转换写入的最大字节数。精度采用句点 ( . ) 的形式,后跟星号*(稍后描述)或可选的十进制整数;如果仅指定周期,则精度为零。
printf 格式字符串允许指定宽度和精度。
宽度,例如%25s
,告诉printf
将字符串填充到 25 个字符的宽度,在字符串之前插入空格。(如果字符串宽于 25 个字符,则仍会完整打印。)
应用于字符串格式的“精度”,例如%.25s
,将打印字符串的长度限制为 25 个字符。3 个字符的字符串将被完整打印(没有填充),30 个字符的字符串将丢失最后五个字符。
%.*s
避免硬编码格式中的精度printf
,在您的情况下,将其指定为 的整数参数max
。
首先,K&R 是 C 的原始实现,与现在的规范不同。如果您想了解有关 K&R C 的特定信息,请查阅特定文档。
从当前的 C 标准:
一个可选精度,它给出 (...) s 转换要写入的最大字节数。精度采用句点 (.) 后跟星号 *(稍后描述)或可选十进制整数的形式。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
类似的文档随处可见,用于多种标准或实现:
点对不同的格式字符串有不同的含义。如果您将 ab 与 %f 一起使用,则 b 给出 length 。a 给出小数点数。如果您将 ab 与 %s 一起使用,a 将给出字符串的最小长度。而 b 给出将要打印的字符串的最大长度。
它实际上根据传递给 printf 的函数以有限数量和命令格式打印字符,在这种情况下,它应该打印“max”的具体内容