根据标准:
每个转换说明符都以字符%开头。在%之后,按照以下顺序依次出现:
- 零个或多个标志[...]。
- 可选的最小字段宽度。[...]
- 一个可选的精度,该精度 [...] 给s转换提供要写入的最大字节数。精度采用句点(.)后面跟一个可选的十进制整数的形式;
- 可选的长度修改符[...]。+一个转换说明符字符[...]。
- 可选的最小字段宽度。[...]
- 一个转换说明符字符[...]。
后来:
负精度参数被视为省略精度。
根据我对标准定义的理解,我期望从 printf("%.-1s\n", "foo")
输出的结果是:
我从标准中引用的第二段话表明,我们可以传递负精度参数,并且会忽略这样的精度。
所以,printf("%.-1s\n", "foo")
应该等同于 printf("%s\n", "foo")
,它将显示 "foo\n"
并返回4
。
然而,在我使用的系统上(osx)printf("%.-1s\n", "foo")
的实际表现是:
printf("%.-1s\n", "foo")
显示" \n"
并返回2
。
这显然与我的期望不同。
- 我对标准的解释有误吗?
- 这种行为是未定义的吗?
- 是否可以传递负的精度(编辑:没有星号)?
*
从参数中获取值时的情况,而不是将精度放在格式字符串中。 - Barmar