www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Dynamic Minimum width with Format / writefln

reply Chris Katko <ckatko gmail.com> writes:
  - First, I'm confused. The docs say 's' is "whatever it needs to 
be". ("he corresponding argument is formatted in a manner 
consistent with its type:") But what if I specifically want a 
STRING. Because I only see floats, ints, etc. No forced string 
types.

  - Second,

This works fine in D:

     printf("%-*s|", col.width-1, col.name.toStringz());

It's a left-aligned, string with a minimum width from the first 
argument, col.width. (-1 because I'm throwing a pipe symbol on 
the end.)

Now with writefln:

     writefln("%-*s|", col.width-1, col.name);

Same format specifier, except I don't need a toStringz which is 
nice. Except it doesn't work and tries to decode col.width-1 into 
a hexadecimal number and only prints that. ("4D6EF6")

I looked through the docs:

https://dlang.org/phobos/std_format.html

  '%' Position Flags Width Separator Precision FormatChar

Width:
     empty
     Integer
     '*'

But there are then zero examples or explanations of how to use 
that option. What's going on here?
Oct 02 2018
parent reply Adam D. Ruppe <destructionator gmail.com> writes:
On Wednesday, 3 October 2018 at 00:14:03 UTC, Chris Katko wrote:
 Except it doesn't work and tries to decode col.width-1 into a 
 hexadecimal number and only prints that. ("4D6EF6")
That number certainly isn't col.width (unless you have a width of like millions)... It looks more like a pointer. What is the type of col.name? If it is string, this code should work fine. I'm guessing it is a char*...
Oct 02 2018
parent reply Chris Katko <ckatko gmail.com> writes:
On Wednesday, 3 October 2018 at 00:34:33 UTC, Adam D. Ruppe wrote:
 On Wednesday, 3 October 2018 at 00:14:03 UTC, Chris Katko wrote:
 Except it doesn't work and tries to decode col.width-1 into a 
 hexadecimal number and only prints that. ("4D6EF6")
That number certainly isn't col.width (unless you have a width of like millions)... It looks more like a pointer. What is the type of col.name? If it is string, this code should work fine. I'm guessing it is a char*...
I'm not sure how I made this mistake. But it seems to only show up now if I leave .toStringz() with the writefln. writefln("%-*s<", col.width-1, col.name.toStringz() /* here */); So maybe I've been staring at code too long tonight and simply missed it?
Oct 02 2018
parent Adam D. Ruppe <destructionator gmail.com> writes:
On Wednesday, 3 October 2018 at 01:14:24 UTC, Chris Katko wrote:
 I'm not sure how I made this mistake. But it seems to only show 
 up now if I leave .toStringz() with the writefln.
Yeah. So what's happening here is toStringz returns the C-style char*, which printf works well with, but writef doesn't trust it and just prints the pointer value instead of trying to traverse it looking for a zero terminator (which might not be there). Just passing a D string will work consistently.
 So maybe I've been staring at code too long tonight and simply 
 missed it?
oh probably, it happens to everyone :)
Oct 02 2018