CaptainProg
CaptainProg

Reputation: 5690

Simple use of sprintf - C

I'm trying to work out why a larger problem is occurring, using a smaller program as an example. This smaller program does not work, leading me to believe it is my understanding of the function that is flawed.

As far as I (had) believed, the following program should initialise a string with up to 30 characters, then take the number '5' to nine significant figures, and turn it into that string. The program should then print the value '5.00000000'. However, the program prints the value 7.96788(...). Why is this?

#include <stdio.h>

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

Upvotes: 21

Views: 88152

Answers (4)

liviu-daniel
liviu-daniel

Reputation: 11

Or you can change the descriptor format: "%.9d"

Upvotes: 0

Marc B
Marc B

Reputation: 360652

Use 5.0 instead. 5 by itself is an integer and will get bitmangled into looking like a float, which is where your 7.xxxx comes from.

Upvotes: 1

Dennis
Dennis

Reputation: 14477

I see two problems:

  1. As others already said, you have to specify a double instead of an int. Your compiler may have a switch to print out warnings in these cases (-Wall in gcc, for example).

  2. To print out 5.00..., you should use %f instead of %g.

That gives sprintf(word,"%.9f", (double) 5); as correct syntax.

Upvotes: 1

ruakh
ruakh

Reputation: 183290

This is because 5 is an integer (int), and you're telling sprintf to pretend that it's a double-precision floating-point number (double). You need to change this:

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

to either of these:

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

Upvotes: 22

Related Questions