我正在处理一段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
。