8

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

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

这里是什么意思"."?当我不在"."这里应用 a 时,会打印整个字符串,但是当我们不应用 a 时".",最多打印最大字符。如果有人能解释这一点,我将非常感激。

4

6 回答 6

11

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

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

%2.6s

指定最小宽度为 2,最大宽度为 6 个字符。如果字符串大于 6 个字符,它将被截断。

于 2013-08-26T13:38:54.313 回答
11

%.*s中,.*限制将写入的字节数。如果这是用包含的数字编写的,例如%.34s,那么数字将是限制。当使用星号时,限制取自 的对应参数printf

fprintf 从 C 2011 (N1570) 7.21.6.1 4 开始,描述et al的转换规范:

一个可选的精度,它给出了……为s转换写入的最大字节数。精度采用句点 ( . ) 的形式,后跟星号*(稍后描述)或可选的十进制整数;如果仅指定周期,则精度为零。

于 2013-08-26T13:37:37.390 回答
4

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

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

应用于字符串格式的“精度”,例如%.25s,将打印字符串的长度限制为 25 个字符。3 个字符的字符串将被完整打印(没有填充),30 个字符的字符串将丢失最后五个字符。

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

于 2013-08-26T13:40:21.047 回答
2

首先,K&R 是 C 的原始实现,与现在的规范不同。如果您想了解有关 K&R C 的特定信息,请查阅特定文档。

从当前的 C 标准:

一个可选精度,它给出 (...) s 转换要写入的最大字节数。精度采用句点 (.) 后跟星号 *(稍后描述)或可选十进制整数的形式。

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

类似的文档随处可见,用于多种标准或实现:

于 2013-08-26T13:44:11.340 回答
1

点对不同的格式字符串有不同的含义。如果您将 ab 与 %f 一起使用,则 b 给出 length 。a 给出小数点数。如果您将 ab 与 %s 一起使用,a 将给出字符串的最小长度。而 b 给出将要打印的字符串的最大长度。

于 2013-08-26T15:50:45.363 回答
0

它实际上根据传递给 printf 的函数以有限数量和命令格式打印字符,在这种情况下,它应该打印“max”的具体内容

于 2021-02-11T14:38:38.637 回答