使用printf打印size_t的正确方法是什么?


69

Size_t被定义为unsigned整数,但是其大小取决于您使用的是32位还是64位计算机。什么是正确且可移植的打印方式size_t



1
@CiroSantilli六四事件法轮功纳米比亚威视我将其保留为开放状态,因为重复项包含一些错误的答案,而此答案具有一个公认的答案。
edmz 2015年

@black您也可以建议以其他方式关闭。对我来说都很好。
西罗Santilli郝海东冠状病六四事件法轮功

Answers:


103

尝试使用%zu格式字符串

size_t val = get_the_value();
printf("%zu",val);

z部分是一个长度说明符,表示参数的长度为size_t。

来源-http://en.wikipedia.org/wiki/Printf#printf_format_placeholders


4
size_t是无符号类型,因此您仍然需要使用'u'作为格式类型以及'z'长度修饰符。
CB Bailey 2009年

9
另外,“ z”修饰符是对printf的C99附加功能,因此它并不是严格的标准C ++功能。
CB Bailey 2009年

@Charles更正了u部分,我在开始处添加了C标签。我希望它比C ++更具C功能,因为C ++可以执行cout路线。
JaredPar 2009年

1
我的编译器(gcc)发出警告:unknown conversion type character 'z' in format [-Wformat]|,并且在程序运行时,它只是zu作为输出显示
Edward Karak

2
因此,引入了@Ruslan位置参数。参见stackoverflow.com/questions/6322540/…。如果使用它们,则您的顾虑不适用。
Keinstein '17

9

上面有一个C ++标记,cout <<另一个可能的答案是。

令人惊讶的是,在所有版本的C中都很难做到这一点。在C90中,强制转换为unsigned long应该起作用,但在C99中可能不起作用,并且C99解决方案不一定在C90中起作用。在1995年的更改中引入了可靠区分C90和C99的能力(指定了__STDC__)。我不认为有一种完全可移植的方式可用于C90,C99和C ++,尽管其中任何一种都有解决方案。


7

我认为C ++的答案是:

std::size_t n = 1;
std::cout << n;

对于C风格的IO,它要复杂一些。在C99中,他们zsize_t值添加了长度修饰符。但是,在TR1之前,不支持此功能,因此您只能将其投射为特定大小,例如:

std::size_t n = 1;
std::printf("%lu\n", static_cast<unsigned long>(n));

再说一次,unsigned long longC ++确实并没有真正支持它,因此上述方法可以正常工作,因为unsigned long它是最大的合法整数类型。在TR1之后,您可以%zu安全地使用size_t值。


C ++如何不支持unsigned long long?如果您基于在某些平台上相同的sizeof,这与不支持它是不一样的。请注意,我对C ++的反应非常糟糕(即使我觉得它很丑陋),我也喜欢C,但是我没有遇到过长期不支持unsigned的C ++编译器。当然可以,它支持uint64_t。
Pryftan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.