我正在尝试打印类似的类型 off_tsize_t. 。正确的占位符是什么 printf() 那是便携式的?

或者是否有完全不同的方式来打印这些变量?

有帮助吗?

解决方案

可以使用z用于为size_t和t为ptrdiff_t的像

printf("%zu %td", size, ptrdiff);

但我的联机帮助说一些老图书馆使用不同的性格比z和鼓励使用它。不过,它的标准化(由C99标准)。对于那些intmax_tint8_tstdint.h等等,还有你可以使用宏,像另一个回答说:

printf("value: %" PRId32, some_int32_t);
printf("value: %" PRIu16, some_uint16_t);

它们列在inttypes.h的手册页。

个人而言,我只投值以unsigned longlong像另一个答案建议。如果使用C99,然后就可以(也应该当然)转换为unsigned long longlong long和分别使用%llu%lld格式。

其他提示

哪个版本的C您使用?

在C90,标准的做法是投射到符号或无符号长,酌情和打印相应。我已经看到了为size_t%Z,但哈比森和斯蒂尔没有在printf()提到它,并在任何情况下,不会帮助你ptrdiff_t的或什么。

在C99中,各_t类型来用自己的printf宏,所以像"Size is " FOO " bytes."我不知道细节,但是这是一个相当大的数字格式的一部分包含文件。

您会想从inttypes.h使用格式宏。

请参阅此问题:跨平台格式字符串变量键入的size_t?

综观man 3 printf在Linux,OS X,和OpenBSD为%zsize_t%tptrdiff_t所有节目支持(C99),但没有提及的那些的off_t。在野外的建议通常提供开%uoff_t转换,这是“足够正确的”,只要能告诉我(二者unsigned intoff_t 64位和32位系统之间变化相同)。

我看到这个帖子至少两次,因为公认的答案是很难remeber对我来说(我很少用zj旗帜和他们好像不是的平台独立的)。

href="https://stackoverflow.com/a/2550799/1691873">标准从来没有明确说size_t确切的数据长度size_t您的平台,然后选择其中的一种:

if sizeof(size_t) == 4 use PRIu32
if sizeof(size_t) == 8 use PRIu64

和我建议使用stdint类型,而不是原始数据类型相合。

我记得,唯一的可移植的方式去做,是投结果为“unsigned long int类型”,并使用%lu

printf("sizeof(int) = %lu", (unsigned long) sizeof(int));

使用 “%ZO” 为off_t。 (八进制) 或 “%つ” 为小数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top