printf宽度说明符的类型

时间:2016-03-25 10:39:56

标签: c printf

以下电话中width的类型应该是什么?

snprintf(buf, buflen, "%.*s", width, astring);

如何指定width在32位和64位平台上都能正常工作?

在64位平台上宽度是否限制为2**32

2 个答案:

答案 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的问题都可能会遇到问题:

  1. 问题是int的范围,而不是平台位宽。

  2. 单次转化的宽度可能会受到限制:

  3.   

    环境限制任何单次转化可以产生的字符数至少应为 4095 。 C11§7.21.6.115

    1. int snprintf()的返回值是打印的字符数。尝试打印超过INT_MAX 字符的来电可能会失败。
    2. <击> 4。细节:在snprintf(buf, buflen, "%.*s", width, astring);中使用时,width是要打印的最小字符,根据需要使用空格填充。