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