【问题标题】:warning: field width specifier '*' expects argument of type 'int', but argument 2 has type 'size_t' {aka 'long unsigned int'}警告:字段宽度说明符“*”需要“int”类型的参数,但参数 2 的类型为“size_t”{又名“long unsigned int”}
【发布时间】:2018-05-23 15:58:25
【问题描述】:

代码:

#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。 :(int)(strlen("foo") + 2)
  • 是的@wildplasser,这也是我的结论,但我问是因为我可能错了..也许除了星星之外还有其他东西可以使用..嗯...跨度>
  • printf(" %s\n", "foo"); 更简单,恕我直言。(甚至:printf(" foo\n");
  • 但是我将如何传递一个宽度变量然后@wildplasser,似乎铸造是要走的路。
  • 你的表达式是常量,不是变量。

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


【解决方案1】:

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()s 参数至关重要,因为它是一个可变参数函数:printf 确定其参数类型的唯一方法是检查格式字符串。 * 需要一个 int。

【讨论】:

  • OP 想要避免强制转换。分配给具有正确 (int) 类型的变量,并将其用作 printf 的参数,这绝对是这个问题的答案。
猜你喜欢
  • 2021-06-22
  • 2015-02-27
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多