以下电话中width
的类型应该是什么?
snprintf(buf, buflen, "%.*s", width, astring);
如何指定width
在32位和64位平台上都能正常工作?
在64位平台上宽度是否限制为2**32
?
答案 0 :(得分:1)
如果您将宽度声明为int
,则宽度将适用于所有平台。 int
的实际大小取决于平台。
星号传递的类型在C99标准第7.19.6.1.5节中规定:
字段宽度或精度或两者都可以用星号表示。在这种情况下,
int
参数提供字段宽度或精度。指定字段宽度或精度或两者的参数应在要转换的参数(如果有)之前(按此顺序)出现。负字段宽度参数被视为 - 标志,后跟正字段宽度。
只要您声明int width
,您的代码就可以在所有符合标准的平台上正常运行。
在64位平台上宽度是否限制为2 32 ?
int
的大小是特定于实现的。在64位平台上它可能是32位,在这种情况下,宽度将限制为2 31 -1,因为负数的解释不同。
答案 1 :(得分:1)
如何指定
width
在32位和64位平台上都能正常工作?
确保width
类型为int
。
在这种情况下,代码使用精度字段"%.*s"
,该字段也是int
。
在64位平台上宽度是否限制为2 ** 32?
任何超过4095的问题都可能会遇到问题:
问题是int
的范围,而不是平台位宽。
单次转化的宽度可能会受到限制:
环境限制任何单次转化可以产生的字符数至少应为 4095 。 C11§7.21.6.115
int snprintf()
的返回值是打印的字符数。尝试打印超过INT_MAX
总字符的来电可能会失败。 <击> 4。细节:在snprintf(buf, buflen, "%.*s", width, astring);
中使用时,width
是要打印的最小字符,根据需要使用空格填充。
击>