【问题标题】:Is the %zu specifier required for printf?printf 是否需要 %zu 说明符?
【发布时间】:2017-05-06 22:37:57
【问题描述】:

我们在嵌入式平台上使用 C89。我试图打印出size_t,但没有成功:

#include <stdio.h>
int main(void) {
    size_t n = 123;
    printf("%zu\n",n);
    return 0;
}

我得到的是zu,而不是123
其他说明符正常工作。

如果size_t 存在,zu 是否也应该在printf 中可用?
这是我应该联系我的库供应商的事情,还是允许库实现排除它?

【问题讨论】:

标签: c printf c89 size-t c-libraries


【解决方案1】:

如果 size_t 存在,zu 不应该在 printf 中也可用吗?

size_t 至少从 C89 开始就存在,但相应的格式说明符 %zu(特别是长度修饰符 z)仅在 C99 之后才被添加到标准中。

因此,如果您不能使用 C99(或 C11)并且必须在 C89 中打印 size_t,您只需要回退到其他现有类型,例如:

printf("%lu\n", (unsigned long)n);

【讨论】:

  • 请注意,在unsigned long 足够大以容纳n 的最大可能值的任何平台上(不管它是否足够大),上述代码就足够了,尽管不一定有效处理size_t的全部范围。但是,不能保证size_t 不会大于unsigned long,也不能保证n 总是适合unsigned long。我不知道这会多久出现一次问题[如果计算 sprintf 缓冲区的大小,许多程序可能会遇到不同的问题......
  • ...基于十进制格式的 unsigned long 的最大长度为 10 位并且要输出的值最终长于该长度的假设。
  • 为了更好的便携性,使用printf("%llu\n", (unsigned long long)n);,除非你知道尺寸很小,比如sizeof(int)这种情况你可以直接写printf("%u\n", (unsigned)n);
  • @chqrlie unsigned long long 在 C89 中不存在 - 这就是我建议 unsigned long 的原因。如果unsigned long long 可用(C99),则size_t%zu 说明符也可用。因此,这里根本不需要转换为unsigned long long
【解决方案2】:

size_t 由 sizeof() 返回。 %zu 说明符打印长度。因此要返回 n 的大小,代码应为:#include

int main(void) { size_t n=123; printf("%zu\n",sizeof (n));返回 0;` }

【讨论】:

    【解决方案3】:

    这工作正常。在我的系统中,它正在打印预期值。 由于编译器,您可能会收到错误。我正在使用 GCC 编译器。如果您只有这个并尝试获取输出,请先更新 GCC,然后尝试。它会起作用的。

    【讨论】:

    • 问题其实出在C库。不支持%zu 的常见情况是使用 gcc 和系统的 Microsoft C 库的旧版 MinGW,直到最近才支持大多数 C99 扩展。
    猜你喜欢
    • 2013-03-14
    • 1970-01-01
    • 2021-07-05
    • 2017-06-30
    • 2013-07-26
    • 2013-07-22
    • 1970-01-01
    • 2011-05-23
    • 2012-03-14
    相关资源
    最近更新 更多