Thread overview | ||||||
---|---|---|---|---|---|---|
|
October 03, 2018 Dynamic Minimum width with Format / writefln | ||||
---|---|---|---|---|
| ||||
- 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? |
October 03, 2018 Re: Dynamic Minimum width with Format / writefln | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris Katko | 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*...
|
October 03, 2018 Re: Dynamic Minimum width with Format / writefln | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | 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?
|
October 03, 2018 Re: Dynamic Minimum width with Format / writefln | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris Katko | 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 :) |
Copyright © 1999-2021 by the D Language Foundation