On Sun, 24 Apr 2011 17:22:39 -0400, dsimcha <[email protected]> wrote:

On 4/24/2011 5:22 PM, Justin Hanekom wrote:
Hi all,

I have what should be an *extremely* simple question that Im banging my head against: how to use
sprintf to format something to a string.

I have tried:
   import std.stdio;
   ...
   auto buffer = new char[12];
   auto chars_written = sprintf(cast(char *) buffer, "%d", 12345);
   writeln(chars_written);
and various other ways of getting the buffer into sprintf, but no matter what I do the program seems to
die when sprintf is called.

What I'm ultimately trying to do here is format a number with thousands separated by commas.

Any idea?

Thanks, Justin

sprintf is a C function. The string you passed needs to be zero-terminated. Since it's not, sprintf probably keeps trying to write more stuff until it segfaults, because it never finds the zero terminator. See std.string.toStringz (http://www.digitalmars.com/d/2.0/phobos/std_string.html#toStringz).

This is not true. sprintf does not care if the destination buffer is zero terminated, because it actually writes the zero. The requirement is simply that the buffer be large enough to handle the data.

Even the safer version of sprintf (snprintf) does not require the buffer to be zero-terminated before calling the function.

The problem the OP has is he is casting buffer to a char *. He should just use buffer.ptr.

This should work:

auto chars_written = sprintf(buffer.ptr, "%d", 12345);

-Steve

Reply via email to