格式'%d'需要类型为'int'的参数,但参数2的类型为'size_t'[-Wformat]

时间:2012-10-13 18:09:04

标签: c strlen

我已经搜索了这个警告,并且每个人的代码都有一些错误,但这里有一些非常意想不到的事情,我无法弄明白。我们确实期望strlen(x)是一个整数,但这个警告告诉我什么? strlen怎么可能不是int?

In function ‘fn_product’:
line85:3:warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘size_t’ [-Wformat]

我在fn_product中的代码 -

char *fn_product (char x[],char y[]){
  if (strlen(x)==1)    // line85
    printf("\nlength of string--%d\n", strlen(x));
  /*other code*/
}

不应该strlen(x)为int。为什么说格式为size_t?

3 个答案:

答案 0 :(得分:30)

您检查了man page吗? strlen(3)返回size_t。使用%zu进行打印。

正如下面的评论所述,clang有时可以帮助您找到更好的错误消息。对于这个案子,clang的警告非常棒,实际上是:

example.c:6:14: warning: format specifies type 'unsigned int' but the argument
      has type 'size_t' (aka 'unsigned long') [-Wformat]
    printf("%u\n", strlen("abcde"));
            ~^     ~~~~~~~~~~~~~~~
            %zu
1 warning generated.

答案 1 :(得分:0)

int()添加到您的代码中,它会解决错误:)

printf("\nlength of string--%d\n", (int)strlen(x))

答案 2 :(得分:-2)

使用“%ld”代替“%d”。

printf("%ld", strlen(ch));