警告:字段宽度说明符“*”需要 '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 确定其参数类型的唯一方法是检查格式字符串。 * 需要一个整数。