web-dev-qa-db-fra.com

Utilisation simple de sprintf - C

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;
}
21
CaptainProg

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);
22
ruakh

Je vois deux problèmes:

  1. 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).

  2. Pour imprimer 5.00..., vous devez utiliser %f au lieu de %g.

Cela donne sprintf(Word,"%.9f", (double) 5); comme syntaxe correcte.

1
Dennis

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.

1
Marc B

Ou vous pouvez changer le format du descripteur: "%.9d"

0
user3660248