代码:
#include <stdio.h>
#include <string.h>
int main(void) {
int number = 2;
printf("%*s\n", strlen("foo") + number, "foo");
return 0;
}
警告:
prog.c: In function 'main':
prog.c:5:14: warning: field width specifier '*' expects argument of type 'int', but argument 2 has type 'size_t' {aka 'long unsigned int'} [-Wformat=]
printf("%*s\n", strlen("foo") + number, "foo");
~^~ ~~~~~~~~~~~~~~~~~
是否可以在不将strlen()
的结果转换为int
的情况下消除此警告,同时将宽度说明符保留为变量?如果是,怎么样?
答案 0 :(得分:1)
printf期望*
的int,所以只需给它一个int .--&gt;&gt;把它投到int。
printf("%*s\n", (int)(strlen("foo")+number), "foo");
但是如果你想避免演员,你可以使用一个变量作为长度参数:
#include <stdio.h>
#include <string.h>
int main(void) {
int number = 2;
int fmtlen;
fmtlen = strlen("foo") + number;
printf("%*s\n", fmtlen, "foo");
return 0;
}
注意:正确的类型对于printf()
参数是必不可少的,因为它是一个varargs函数:printf确定其参数类型的唯一方法是通过检查格式字符串。并且*
需要一个int。