打印size_t值的可移植代码



我正在处理一段C代码,看起来像

char buf[16];
size_t i = 6;
sprintf(buf, "%d", i);

…编译器警告我,第三个参数是'size_t'类型,而函数期望是'int'。

所以我试着告诉它它会得到一个unsigned int

sprintf(buf, "%u", i);

现在编译器警告我第三个参数是'size_t'类型,而函数期望是'unsigned int'。


从我读到的关于这个问题的其他问题/答案中,我不能假设size_t是一个unsigned int,这解释了警告。

  • 那么我如何重写这行,使编译器高兴(也就是说,编译器是沉默的)?

编辑:

在别人提出建议之前,我正在寻找一个解决方案,这个解决方案实际上可以解决一些事情可能出错的轻微可能性。所以通过

强制类型转换
sprintf(buf, "%d", (int)i);

sprintf(buf, "%u", (unsigned int)i);

是不可取的。

C99和C11需要一个z修饰符:

sprintf(buf, "%zu", i);

如果MS Visual Studio也必须适应,生活可能会更困难(因为它不遵守C99或C11标准)。根据MSDN,您需要使用I而不是z

最新更新