Utilisation Simple de sprintf-C

J'essaie de comprendre pourquoi un problème plus important se produit, en utilisant un programme plus petit comme exemple. Ce petit programme ne fonctionne pas, m'amenant à croire que c'est ma compréhension de la fonction qui est imparfait.

Pour autant que je (avais) cru, le programme suivant devrait initialiser une chaîne avec jusqu'à 30 caractères, puis prendre le nombre '5' à neuf chiffres significatifs, et le transformer en cette chaîne. Le programme doit ensuite imprimer 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
demandé sur Peter Mortensen 2011-11-22 23:31:42

4 réponses

C'est parce que 5 est un entier (int), et vous racontez sprintf prétendre que c'est un double-nombre à virgule flottante (double). Vous devez changer ceci:

sprintf(word,"%.9g", 5);

À l'un ou l'autre de ces:

sprintf(word,"%.9g", 5.0);
sprintf(word,"%.9g", (double) 5);
22
répondu ruakh 2011-11-22 19:34:26

, je vois deux problèmes:

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

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

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

1
répondu Dennis 2011-11-22 19:57:34

Utilisez 5.0 à la place. 5 en soi est un entier et sera bitmangled en ressemblant à un float, qui est où votre 7.xxxx vient de.

1
répondu Marc B 2017-05-22 19:17:52

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

0
répondu user3660248 2017-05-22 19:19:40