Простое использование sprintf - C
Я пытаюсь понять, почему возникает большая проблема, используя меньшую программу в качестве примера. Эта небольшая программа не работает, заставив меня поверить в то, что я понимаю недостающую функцию.
Насколько я полагал (полагаю), следующая программа должна инициализировать строку длиной до 30 символов, затем принять число "5" до девяти значимых цифр и превратить ее в эту строку. Затем программа должна распечатать значение "5.00000000". Однако программа печатает значение 7.96788 (...). Почему это?
#include <stdio.h>
int main()
{
char word[30];
sprintf(word, "%.9g", 5);
printf(word);
return 0;
}
Ответы
Ответ 1
Это потому, что 5
является целым числом (int
), и вы говорите sprintf
, чтобы сделать вид, что это число с плавающей запятой с двойной точностью (double
). Вам нужно изменить это:
sprintf(word,"%.9g", 5);
для любого из них:
sprintf(word,"%.9g", 5.0);
sprintf(word,"%.9g", (double) 5);
Ответ 2
Используйте 5.0
вместо этого. 5
сам по себе является целым числом и будет битово считать похожим на float, откуда приходит ваш 7.xxxx.
Ответ 3
Я вижу две проблемы:
-
Как уже говорили другие, вы должны указать double
вместо int
. У вашего компилятора может быть переключатель для печати предупреждений в этих случаях (-Wall
в gcc, например).
-
Чтобы распечатать 5.00...
, вы должны использовать %f
вместо %g
.
Это дает sprintf(word,"%.9f", (double) 5);
как правильный синтаксис.
Ответ 4
Или вы можете изменить формат дескриптора: "%.9d"