Mr *_*day 4 c string size printf types
我想做这样的事情:
char sLength[SIZE_T_LEN];
sprintf(sLength, "%zu", strlen(sSomeString));
Run Code Online (Sandbox Code Playgroud)
也就是说,我想在缓冲区中打印一个类型的值size_t.问题是:应该是什么价值SIZE_T_LEN?关键是要知道所需的最小尺寸,以确保永远不会发生溢出.
sizeof(size_t) * CHAR_BIT(from limits.h)给出位数.对于十进制输出,使用每个数字的(粗略)低估计3(十六进制4)位在安全端.不要忘记添加字符串1的nul终止符.
所以:
#include <limits.h>
#define SIZE_T_LEN ( (sizeof(size_t) * CHAR_BIT + 2) / 3 + 1 )
Run Code Online (Sandbox Code Playgroud)
这会产生类型size_t本身的值.在典型的8/16/32/64位平台+ 2上不需要(最小可能的大小size_t为16位).这里的错误已经足够大,可以产生正确的截断结果.
请注意,这给出了一个上限,并且由于使用而完全可移植CHAR_BIT.要获得准确的值,您必须使用log10(SIZE_MAX)(请参阅JohnBollinger的答案).但是这产生了一个浮点数并且可能在运行时计算,而上面的版本是编译时评估的(并且可能比粗略估计的成本更多).除非你有一个RAM限制系统,否则没问题.在这样的系统上,stdio无论如何都应该避免使用.
为了绝对安全,您可能想要使用snprintf(但这不是必需的).