【问题标题】:format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘size_t’ [-Wformat]格式“%d”需要“int”类型的参数,但参数 2 的类型为“size_t”[-Wformat]
【发布时间】:2012-10-04 05:50:20
【问题描述】:

我已经搜索过这个警告,每个人的代码都有一些错误,但这里有一些非常意想不到的东西,我无法弄清楚。我们确实希望 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格式?

【问题讨论】:

  • strlen的返回类型是size_t

标签: c strlen


【解决方案1】:

使用“%ld”而不是“%d”。

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

【讨论】:

  • %zu 专门用于 size_t 我喜欢 %ld 的想法,假设您认为它不是整数,但 %d 应该适用于 size_t,和%zu 一起——这里发生了其他事情。
【解决方案2】:

(int) 添加到您的代码中,它应该可以修复错误:

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

【讨论】:

  • 你有一个错字。另外,我认为将size_t 转换为int 并不绝对安全。
  • 我在 x64 位操作系统上遇到了同样的问题,它解决了问题
  • 你确定你不是指int(strlen(x))(int)strlen(x) 而不是int()strlen(x)
  • 看看下面的图片,顺便说一句,我不是 c 程序员
  • 只有当字符串长度为INT_MAX或更短时才可以;否则会导致未定义的行为。一个改进是使用%u%lu 并分别转换为unsignedunsigned long(如果您担心%zu 的可移植性)。
【解决方案3】:

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

如下面的 cmets 所述,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.

【讨论】:

  • 但是我接触c编程一年了。从来没有遇到过这样的警告。好吧,警告消失了。:)
  • @optimist,我猜你已经关闭或关闭了警告级别,或者你一直在使用草率的编译器。 strlen()至少 C89 以来已返回size_t,因此已经有 20 多年了。我敢肯定它甚至更长,但我没有更旧的规范要检查。
  • @optimist 更改编译器是错误的策略。编写正确的代码。
  • @optimist,正如您在上面的警告消息中看到的,size_tunsigned long(至少在我的机器上)。像您描述的那样进行比较时,会发生常规整数提升,因此那里应该没有问题。 %zu 肯定是整数格式 - 这就是 u 的用途。 z 只是size_t 的便携式大小修改器。在我的示例中,您也可以使用%lu,但它的便携性较差(例如,想象一台机器,其中size_tunsigned int)。
  • @Kevin - z 长度修饰符是标准 C99(7.19.6.1 第 7 段)的一部分。
猜你喜欢
  • 1970-01-01
  • 2015-02-27
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多