警告:字段宽度说明符“*”需要 'int' 类型的参数,但参数 2 的类型为 'size_t' {aka 'long unsigned int'}
warning: field width specifier '*' expects argument of type 'int', but argument 2 has type 'size_t' {aka 'long unsigned int'}
代码:
#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
的情况下消除此警告,同时将宽度说明符保持为变量?如果是,怎么做?
printf 期望 *
是一个 int,所以只需给它一个 int。-->> 将其转换为 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()
的参数至关重要,因为它是一个可变参数函数:printf 确定其参数类型的唯一方法是检查格式字符串。 *
需要一个整数。
代码:
#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
的情况下消除此警告,同时将宽度说明符保持为变量?如果是,怎么做?
printf 期望 *
是一个 int,所以只需给它一个 int。-->> 将其转换为 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()
的参数至关重要,因为它是一个可变参数函数:printf 确定其参数类型的唯一方法是检查格式字符串。 *
需要一个整数。