将`%* s`与`printf`一起使用时的编译器警告

时间:2011-09-20 14:32:46

标签: c warnings printf

编译以下内容时:

printf("%*s",lengths[i],row[i]);

我收到了这个警告:

4.0.c:407: warning: field width should have type ‘int’, but argument 2 has type 
‘long  unsigned int’

长度声明为:unsigned long *lengths;

我试图解决问题,但无济于事。 添加这个,

printf("%*lu",(unsigned long)lengths[i],row[i]);

我没有收到任何警告,但代码无法正常工作。

谢谢维拉

5 个答案:

答案 0 :(得分:8)

将其投放到int

printf("%*s", (int) lengths[i], row[i]);

答案 1 :(得分:2)

这是打印它的正确方法:

printf("%*s", (int) lengths[i], row[i]);

根据http://en.wikipedia.org/wiki/Printf#Format_placeholders

  

* - 使printf填充输出,直到它是n个字符宽,其中n是存储在前面的函数参数中的整数值由修改类型表示的。例如printf("%*d", 5, 10)将导致打印“10”,宽度为5。

因此,除非lengths用于其他需要unsigned long的其他内容,否则我建议将其转换为int *lengths

答案 2 :(得分:2)

确保该值不大于INT_MAX并将其转换为int以同意printf转换说明符中的星号

printf("%*s", (int)lengths[i], row[i]);

C99 Standard中的7.19.6.1/5:

  

... int 参数提供字段宽度或精度......

答案 3 :(得分:0)

像这样使用...... printf("%*ul", (int) lengths[i], row[i]);

答案 4 :(得分:0)

为了确保我了解您要执行的操作,您希望将row[i]打印为字段宽度由lengths[i]指定的字符串?

如果是这种情况,您需要将lengths[i]的值转换为int

printf("%*s", (int) lengths[i], row[i]);

如果您正在尝试做什么,那么您需要使用更多信息更新您的问题。