C printf宽度说明符的类型
在下面的调用中,C printf宽度说明符的类型,c,printf,C,Printf,在下面的调用中,width的类型应该是什么 snprintf(buf, buflen, "%.*s", width, astring); 如何指定width在32位和64位平台上都能正常工作 在64位平台上宽度是否限制为2**32?如果您将宽度声明为int,则宽度将在所有平台上都有效。int的实际大小取决于平台 C99标准第7.19.6.1.5节规定了星号的类型: 字段宽度或精度或两者都可用星号表示。在这种情况下,int参数提供字段宽度或精度。指定字段宽度或精度或两者的参数(按顺序)应出现在要
width
的类型应该是什么
snprintf(buf, buflen, "%.*s", width, astring);
如何指定width
在32位和64位平台上都能正常工作
在64位平台上宽度是否限制为
2**32
?如果您将宽度声明为int
,则宽度将在所有平台上都有效。int
的实际大小取决于平台
C99标准第7.19.6.1.5节规定了星号的类型:
字段宽度或精度或两者都可用星号表示。在这种情况下,int
参数提供字段宽度或精度。指定字段宽度或精度或两者的参数(按顺序)应出现在要转换的参数(如果有)之前。负字段宽度参数被视为-标志,后跟正字段宽度
只要您声明int-width
,您的代码就可以在所有符合标准的平台上正常工作
64位平台上的宽度是否限制为232
int
的大小是特定于实现的。在64位平台上,它可能是32位,在这种情况下,宽度将限制为231-1,因为负数的解释不同
如何指定width
在32位和64位平台上都能正常工作
确保width
为类型int
在这种情况下,代码使用一个精度字段,“%.*s”
,它也是int
在64位平台上,宽度是否限制为2**32 任何超过4095的产品都可能会遇到以下问题:
int
的范围,而不是平台位宽度int snprintf()
的返回值是打印的字符数。试图打印超过INT\u MAX
总字符数的调用可能会失败宽度
是要打印的最小字符数,根据需要填充空格。
width
必须是int
。2**32
(实际上是2**31-1
)字符不够宽吗?如果int\u MAX
不够宽,你当然可以不用snprintf
达到同样的效果。这是否意味着,LLP64
和LP64
数据模型对宽度长度施加了限制,这意味着不可能为*printf
?@qarma是,LLP64和LP64都提供64位宽度参数。只有ILP64使用64位整数。一旦你想输出那么多字符,你肯定不会使用printf()。谢谢,@joop我想确保我可以使用指针算法,比如width=ptr1-ptr2
,后者是结果,例如strchr()
。不要这样做。或者使用cast(int)(ptr1-ptr2)
强制printf的参数为实际的int(因为它们无法推断,vararg函数依赖于传递的正确类型)。我想知道您的评论4:我从GCC得到了什么:%*s
--永远不要截断,向右填充<代码>%.*s--截断,从不填充%*s
--编译时警告。@qama face palm:我(错误地)说明了一些关于宽度字段的内容,而不是post使用的精度字段。