web-dev-qa-db-fra.com

le format '% d' attend un argument de type 'int', mais l'argument 2 a le type 'size_t'

J'ai cherché sur cet avertissement et tout le monde avait une erreur dans son code, mais voici quelque chose de très inattendu que je ne pouvais pas comprendre. Nous nous attendons à ce que strlen (x) soit un entier, mais que me dit cet avertissement? Comment strlen ne pouvait-il pas être int?

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

Mon code dans 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) ne devrait-il pas être int. Pourquoi dit-on que le format est au format size_t?

20
Optimus Prime

Avez-vous vérifié la page de manuel ? strlen(3) renvoie size_t. Utilisez %zu pour l’imprimer.

Comme mentionné dans les commentaires ci-dessous, clang est parfois utile pour trouver de meilleurs messages d'erreur. L'avertissement de Clang concernant exactement ce cas est plutôt bon, en fait:

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

Ajoutez int() à votre code, cela corrigerait l'erreur :) 

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