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

bra*_*ray 68 c c++

Size_t被定义为一个unsigned整数,但它的大小取决于你是在32位还是64位机器上.什么是正确和便携的打印方式size_t

Jar*_*Par 98

尝试使用%zu格式字符串

size_t val = get_the_value();
printf("%zu",val);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 此外,'z'修饰符是printf的C99补充,因此它不是严格意义上的标准C++特性. (9认同)
  • size_t是无符号类型,因此您仍然需要使用"u"作为格式类型以及"z"长度修饰符. (4认同)
  • 我的编译器 (gcc) 给出警告:`unknown conversion type character 'z' in format [-Wformat]|`,当程序运行时它只打印 `zu` 作为输出 (2认同)
  • @Ruslan 为此引入了位置参数。请参阅 /sf/ask/442577831/。如果使用它们,则您的担忧不适用。 (2认同)

Dav*_*ley 9

这有一个C++标签,cout <<另一个可能的答案.

这在C90的所有版本中都难以实现.在C90中,转换unsigned long应该可以工作,但这在C99中可能不起作用,并且C99解决方案不一定适用于C90.在1995年的变化(指定允许值__STDC__)中引入了可靠地区分C90和C99的能力.我不认为有一种完全可移植的方式适用于C90,C99和C++,尽管有针对任何一个的解决方案.


D.S*_*ley 7

我认为C++的答案是:

std::size_t n = 1;
std::cout << n;
Run Code Online (Sandbox Code Playgroud)

对于C风格的IO来说,它有点复杂.在C99中,他们zsize_t值添加了长度修饰符.但是,在TR1之前不支持此功能,因此您可以将其转换为特定大小,如:

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

然后,unsigned long longC++并不真正支持,所以上面的工作正常,因为unsigned long它是最大的合法整数类型.在TR1之后,您可以%zu安全地使用size_t值.