Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C printf宽度说明符的类型_C_Printf - Fatal编程技术网

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
    的范围,而不是平台位宽度

  • 单个转换的宽度可能受到限制:

  • 环境限制任何单个转换可产生的字符数应至少为4095。C11§7.21.6.1 15

  • int snprintf()
    的返回值是打印的字符数。试图打印超过
    INT\u MAX
    总字符数的调用可能会失败
  • 四,。细节:如snprintf中所用(buf,buflen,“%.*s”,宽度,收缩),
    宽度
    是要打印的最小字符数,根据需要填充空格。
    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使用的精度字段。