Sprintf bug (?)

Hello all,

I am wondering if I have just found a bug in (s)printf…

According to the PickAxe, table “sprintf flag characters”:

================= snip ==================================

0 (zero) all Pad with zeros, not spaces.

================= snip ==================================

so I think this call

irb(main):053:0> sprintf(“%05s”, 123)
=> " 123"

should correctly result in

“00123”

or I am getting something wrong?

thanks,
Peter

__
http://www.rubyrailways.com

Peter S. wrote:

================= snip ==================================
or I am getting something wrong?
I think ruby follows the C standard, which says zero padding only
applies to numeric formats.

----- Original Message -----
From: “Peter S.” [email protected]
To: “ruby-talk ML” [email protected]
Sent: Saturday, November 11, 2006 1:28 PM
Subject: sprintf bug (?)

================= snip ==================================

so I think this call

irb(main):053:0> sprintf(“%05s”, 123)
=> " 123"

should correctly result in

“00123”

sprintf(“%05d”,123) # ‘d’ not ‘s’
=> “00123”

Bernard K. wrote:

irb(main):053:0> sprintf(“%05s”, 123)
=> " 123"

should correctly result in

“00123”

sprintf(“%05d”,123) # ‘d’ not ‘s’
=> “00123”

:slight_smile: I know ‘d’ is not ‘s’, it was a bad example. It should have been

irb(main):002:0> sprintf(“%10s”,‘hello’)
=> " hello"

(there are no zeroes…)

Peter

__
http://www.rubyrailways.com

Hi,

In message “Re: sprintf bug (?)”
on Mon, 13 Nov 2006 07:03:44 +0900, Timothy H.
[email protected] writes:

|Possibly you meant “%010s” instead of “%10s”? In any case, I checked the
|output of a C program compiled with gcc on my Powerbook running OS X
|10.8. In this case, the ‘0’ flag adds padding on the left:

This is platform dependent. Linux manpage says:

   0      The value should be zero padded.  For d, i, o, u, x, X,
          a, A, e, E, f, F, g, and G conversions, the converted
          value is padded on the left with zeros rather than
          blanks.  If the 0 and - flags both appear, the 0 flag is
          ignored.  If a precision is given with a numeric
          conversion (d, i, o, u, x, and X), the 0 flag is
          ignored.  For other conversions, the behavior is
                                           ~~~~~~~~~~~~~~~
          undefined.
          ~~~~~~~~~

zero option affects some specifiers. %s is not among them.

						matz.

Yukihiro M. wrote:

zero option affects some specifiers. %s is not among them.

Thank, Matz. This made it really clear at last…

Peter
__
http://www.rubyrailways.com

Peter S. wrote:

so I think this call
=> “00123”

Possibly you meant “%010s” instead of “%10s”? In any case, I checked the
output of a C program compiled with gcc on my Powerbook running OS X
10.8. In this case, the ‘0’ flag adds padding on the left:

ruby$ cat testit.c
#include <stdio.h>

int main(int argc, char *argv[])
{
printf("%010s", “hello\n”);
return 0;
}

ruby$ ./testit
0000hello
ruby$

----- Original Message -----
From: “Yukihiro M.” [email protected]
To: “ruby-talk ML” [email protected]
Sent: Sunday, November 12, 2006 6:34 PM
Subject: Re: sprintf bug (?)

This is platform dependent. Linux manpage says:
~~~~~~~~~

zero option affects some specifiers. %s is not among them.

matz.

I suggest that the OP asks ruby’s description of sprintf via “ri
sprintf”
… it is essentially as described above

----- Original Message -----
From: “Peter S.” [email protected]
To: “ruby-talk ML” [email protected]
Sent: Sunday, November 12, 2006 4:43 PM
Subject: Re: sprintf bug (?)

so I think this call

:slight_smile: I know ‘d’ is not ‘s’, it was a bad example. It should have been

irb(main):002:0> sprintf(“%10s”,‘hello’)
=> " hello"

(there are no zeroes…)

Peter

This is the correct behavior of sprintf for strings