Comparaison de chaînes de caractères C - strcmp()
Je suis en train de comparer deux chaînes de caractères, mais je ne réalisation de cet objectif. Pourquoi?
#include <stdio.h>
#include <string.h>
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
- Mais les deux chaînes sont clairement différents, de sorte que
strcmp()
fonctionne comme il le devrait. - Essayez d'imprimer à la FOIS c et b, des chaînes...
- Oh..... donc, mon sprinf fonctionne mal...
- Définir "l'échec"...
Vous devez vous connecter pour publier un commentaire.
Les deux chaînes sont clairement différents, de sorte que
strcmp()
fonctionne comme il le devrait.Le problème est que
1231.23123
ne peut pas être représenté comme unefloat
. En fait, le nombre plus proche peut être représenté comme unfloat
est1231.231201171875
, qui est ce que vous voyez (arrondi parsprintf()
à six décimales).Si vous voulez un nombre de chiffres à comparer dans une chaîne de caractères, utilisez le spécificateur de précision dans
sprintf
-%.5f
, et comme d'autres l'ont souligné, le numéro que vous avez choisi ne peut pas être représenté par unfloat
, mais peut être représenté par undouble
. c'est à dire.5
?%f
imprime 6 chiffres après la virgule, à moins que vous décidiez de les."1231.231230"
(et en omettant les.5
)."1.000000"
au lieu de"1.0"
avec%.1f
C'est parce que la précision de flotteur ne peut pas supporter donc de nombreux chiffres. Donc b n'est pas "1231.23123". Dans mon test, c'est "1231.231201".
De la comparaison de ces 2 chaînes ici:
qui sont différentes, en effet, ainsi
strcmp
renvoie une valeur non nulle.Le réel problème ici est que lorsque vous avez
float a = 1231.23123;
, le numéro que vous souhaitez stocker dansa
ne peut pas être représenté comme unefloat
, le plus proche nombre qui peut être représenté comme unfloat
est1231.231201171875
dans ce cas. Jetez un oeil à OMG Poneys!!! (Aka L'Humanité: Epic Fail) 😉Pour résoudre votre problème, je voudrais commencer avec l'aide de
double
au lieu defloat
pour obtenir plus de précision. Ensuite, vous pouvez spécifier la précision (%.5lf
) lors de l'impression de ce numéro dans la chaîne pour s'assurer que le nombre est arrondi comme vous en avez besoin: