Utilisation simple de sprintf – C

J’essaie de comprendre pourquoi un problème plus important se pose, en utilisant un programme plus petit comme exemple. 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’eus (l’avait cru), le programme suivant devrait initialiser une chaîne de 30 caractères maximum, puis prendre le nombre «5» à neuf chiffres significatifs et le transformer en cette chaîne. Le programme doit ensuite afficher la valeur ‘5.00000000’. Cependant, le programme imprime la valeur 7.96788 (…). Pourquoi est-ce?

#include  int main() { char word[30]; sprintf(word, "%.9g", 5); printf(word); return 0; } 

Cela 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:

  1. Comme d’autres l’ont déjà dit, vous devez spécifier un double au lieu d’un int . Votre compilateur peut avoir un commutateur pour imprimer des avertissements dans ces cas ( -Wall dans gcc, par exemple).

  2. 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 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"