Comparaison de chaînes C – strcmp ()

J’essaie de comparer deux chaînes, mais je n’y parviens pas. Pourquoi?

#include  #include  int main(){ float a = 1231.23123; char b[32]; sprintf(b, "%f", a); printf("%s\n", b); char c[32] = "1231.23123"; if (strcmp(c, b) == 0){ printf("SUCCES\n"); } else{ printf("DIFFER\n"); } return 0; } 

Résultat:

 1231.231201 DIFFER 

    Les deux chaînes sont clairement différentes, donc strcmp() fonctionne comme il se doit.

    Le problème est que 1231.23123 ne peut pas être représenté comme un float . En fait, le nombre le plus proche qui peut être représenté par un float est 1231.231201171875 , c’est ce que vous voyez (arrondi par sprintf() à six décimales).

    Si vous souhaitez comparer un nombre défini de chiffres dans une chaîne, utilisez le spécificateur de précision dans sprintf%.5f , et comme d’autres l’ont souligné, le nombre que vous avez choisi ne peut pas être représenté par un float , mais peut l’être. par un double . c’est à dire

     double a = 1231.23123; char b[32]; sprintf(b, "%.5f",a); 

    C’est parce que la précision de float ne peut pas supporter autant de chiffres. Donc, b n’est pas “1231.23123”. Dans mon test, c’est “1231.231201”.

    Vous comparez ces 2 chaînes ici:

     1231.23123 1231.231201 

    strcmp renvoie donc une valeur non nulle.

    Le problème actuel est que lorsque vous faites float a = 1231.23123; , le nombre que vous souhaitez stocker dans a 1231.231201171875 ne peut pas être représenté sous forme de float , le nombre le plus proche pouvant être représenté sous forme de float est 1231.231201171875 dans ce cas. Regardez poneys OMG !!! (Aka Humanity: Epic Fail) 😉


    Pour résoudre votre problème, je commencerais par utiliser double au lieu de float pour obtenir une précision plus précise. Ensuite, vous pouvez spécifier la précision ( %.5lf ) tout en imprimant ce nombre dans la chaîne pour vous assurer que le nombre est arrondi exactement comme vous en avez besoin:

     double d = 1231.23123; char str[32]; sprintf(str, "%.5lf", d); // strcmp(str, "1231.23123") would return 0 here