web-dev-qa-db-ja.com

フォーマット ‘%d’はタイプ ‘int’の引数が必要ですが、引数2のタイプは ‘size_t’です[-Wformat]

私はこの警告について検索しましたが、誰もがコードに誤りがありましたが、ここでは私が理解できなかった非常に予期しないものがあります。 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形式であると言うのですか?

21
Optimus Prime

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.
31
Carl Norum

コードにint()を追加すると、エラーが修正されます:)

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