J'essaie de comprendre pourquoi un problème plus grave se pose, en prenant pour exemple un programme plus petit. Ce programme plus petit ne fonctionne pas, ce qui me porte à croire que c'est ma compréhension de la fonction qui est défectueuse.
Autant que je l'eusse cru, le programme suivant devrait initialiser une chaîne de 30 caractères au maximum, puis prendre le nombre «5» à neuf chiffres significatifs et le transformer en chaîne. Le programme doit ensuite afficher la valeur '5.00000000'. Cependant, le programme imprime la valeur 7.96788 (...). Pourquoi est-ce?
#include <stdio.h>
int main()
{
char Word[30];
sprintf(Word, "%.9g", 5);
printf(Word);
return 0;
}
Ceci est dû au fait que 5
est un entier (int
) et que vous dites à sprintf
de prétendre qu'il s'agit d'un nombre à virgule flottante à double précision (double
). Vous devez changer ceci:
sprintf(Word,"%.9g", 5);
à l'un de ces:
sprintf(Word,"%.9g", 5.0);
sprintf(Word,"%.9g", (double) 5);
Je vois deux problèmes:
Comme d'autres l'ont déjà dit, vous devez spécifier une double
au lieu d'une int
. Votre compilateur peut avoir un commutateur pour imprimer des avertissements dans ces cas (-Wall
dans gcc, par exemple).
Pour imprimer 5.00...
, vous devez utiliser %f
au lieu de %g
.
Cela donne sprintf(Word,"%.9f", (double) 5);
comme syntaxe correcte.
Utilisez 5.0
à la place. 5
en lui-même est un entier et deviendra bitmangled pour ressembler à un float, d'où provient votre 7.xxxx.
Ou vous pouvez changer le format du descripteur: "%.9d"