C “的含义&引用;在printf中

C “的含义&引用;在printf中,c,C,我正在阅读经典的K&R,遇到了以下语法: printf("%.*s",max,s); 这里的“是什么意思?如果我没有在这里应用”,则会打印整个字符串,但如果我们没有应用“”,则会打印atmost max字符。如果有人能解释这一点,我将非常感谢。在%.*s,*限制要写入的字节数。如果写入时包含一个数字,例如%.34s,则该数字将是限制。当使用星号时,限制从对应的参数中提取到printf 从C 2011(N1570)7.21.6.1 4开始,描述了fprintf等的转换规范: 一种可选精度,它提供

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

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

这里的
是什么意思?如果我没有在这里应用
,则会打印整个字符串,但如果我们没有应用
”,则会打印atmost max字符。如果有人能解释这一点,我将非常感谢。

%.*s
*
限制要写入的字节数。如果写入时包含一个数字,例如
%.34s
,则该数字将是限制。当使用星号时,限制从对应的参数中提取到
printf

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

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

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

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

%2.6s


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

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

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

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


%.*s
避免了对格式中的精度进行硬编码,而是将其指定为
printf
的整数参数,在您的例子中
max
首先,K&R是C的原始实现,与当前规范不同。如果您想了解K&R C的具体信息,请查阅具体文档

根据当前的C标准:

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

对于多个标准或实施,类似的文档在网上随处可见:

  • 格利伯
  • POSIX
  • Microsoft C运行时

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

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

      您读过C标准吗?它指定了这应该如何工作…@D在使用C标准很多次之后,我确信它是不可能读取的。@NikolaiRuhe:对于标准的某些部分可能是这样,但我发现描述
      printf
      的部分可读性很强。忽略标准,man printf在大多数机器上都给出了很好的描述。请注意,在StackOverflow上,一旦问题得到解决,并使询问者满意,他或她就是。这样做的目的是向花时间写答案的志愿者提供象征性的奖励,并根据提问者的判断,让未来的访问者洞察最正确的解决方案。“在写格式时不知道,”这意味着什么?@Veltas当你写一种格式,如
      %.25s
      ,您知道需要25个字符的精度。写入
      %.*s
      时,在运行时之前,精度不确定。我会尝试澄清答案。你可能想写“在
      %.*s
      中,
      *
      部分限制…”否则它有点难读。我会用“整数”或“数字”替换“数字”。@Veltas:谢谢,我在
      *
      之前插入“the”。关于数字和数字,整数和数字是数学对象。数字是表示数字的符号(特别是一串数字)。所以“34”是一个数字而不是数字,就像“狼”是一个单词而不是动物一样。