警告:字段宽度说明符' *'期望类型' int'的参数,但参数2的类型为' size_t' {aka' long unsigned int'}

时间:2017-12-09 16:39:00

标签: c string printf format-specifiers size-t

代码:

#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的情况下消除此警告,同时将宽度说明符保留为变量?如果是,怎么样?

1 个答案:

答案 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。