printf padding with alternate character?

P

pb

Im wanted to pad out blank spaces with a specific character instead of
spaces or zeros, does C support that?

printf("$%*d", '*', 5); // Not sure what the format string is supposed to
look like to do this

example output i would want is this:
$********5
 
B

Ben Pfaff

pb said:
Im wanted to pad out blank spaces with a specific character instead of
spaces or zeros, does C support that?

No. You will have to write your own code to do it.
 
C

Chris Torek

Im wanted to pad out blank spaces with a specific character instead of
spaces or zeros, does C support that?
No.

printf("$%*d", '*', 5); // Not sure what the format string is supposed to
look like to do this

(Note that //-comments wrap around, so that if this had been intended
to be a code example, it would not have worked so well.

The "*" in "%*d" is a field-width specifier that reads an "int"
argument from the argument list, so:

printf("%*d", 2, 5);

prints the value "5" in a ten-character field. The field is blank
or zero padded depending on the pad option selected: blank by
default, zero if you use a 0 modifier.)
example output i would want is this:
$********5

There is no standard way to do this. It is easy to build your own
though: just sprintf() the numeric value, and then work with the
string. In this case, to get an integer printed into a ten digit
field and replace leading blanks or zeros with spaces, just do
something like:

char buf[SOME_SIZE]; /* must be at least 11 chars */
int val;
...
sprintf(buf, "%010d", val); /* produces, e.g., 0000000005 */
subst(buf, '0', '*');

where the subst() function reads:

/*
* Do substitutions on leading characters in the given string:
* Replace all occurrences of "from" with "to". (We assume
* from != '\0'.)
*/
void subst(char *s, char from, char to) {
while (*s == from)
*s++ = to;
}

Note that if you print with leading blanks, you will need to subst()
from ' ' instead of '0'. (This trick works either way.)
 
P

Peter Nilsson

pb said:
Im wanted to pad out blank spaces with a specific character instead of
spaces or zeros, does C support that?

Yes, but not directly through a standard function.
printf("$%*d", '*', 5); // Not sure what the format string is supposed to
look like to do this

example output i would want is this:
$********5

#include <stdio.h>
#include <string.h>

#define HASH "*********"

int main(void)
{
int amount = 520;
char number[100];
sprintf(number, "%d.%02d", amount / 100, amount % 100);
printf( "$%.*s%s\n",
(int) (sizeof HASH - 1 - strlen(number)),
HASH,
number );
return 0;
}

BTW, $ is not a member of the basic character set.
 
M

Mike Wahler

pb said:
Im wanted to pad out blank spaces with a specific character instead of
spaces or zeros, does C support that?

printf("$%*d", '*', 5); // Not sure what the format string is supposed to
look like to do this

example output i would want is this:
$********5

You've got many good answers already. Here's another
alternative:

#include <iostream>
#include <string>
#include <stdio.h>

unsigned int digits(int value, unsigned int radix)
{
unsigned int result = 0;

if(value < 0)
value *= -1;

result = !value;

while(value)
{
++result;
value /= radix;
}

return result;
}

int main()
{
int value = 42;
int wid = 5;
char prefix = '$';
int leading = 0;
char pad = '*';
int i = 0;
unsigned int d = digits(value, 10) + (value < 0);

if(d > wid)
wid = d;

leading = wid - d ;

putchar(prefix);

for(i = 0; i < leading; ++i)
putchar(pad);

printf("%d\n", value);
return 0;
}

-Mike
 
M

Martin Ambuhl

Mike said:
You've got many good answers already. Here's another
alternative:

#include <iostream>
#include <string>
#include <stdio.h>

Did you forget this was comp.lang.c? It's a good thing, since you might
have gotten flamed in comp.lang.c++ for <stdio.h> instead of <cstdio>,
or, in their anti-C exuberance, for using either.
 
M

Mike Wahler

Martin Ambuhl said:
Did you forget this was comp.lang.c?

Actually, no. Those C++ headers are 'residue' from
a 'scratch' file I forgot to delete. (I suppose they
must have been scrolled off the screen.)
It's a good thing, since you might
have gotten flamed in comp.lang.c++ for <stdio.h> instead of <cstdio>,

Any flames about that would be unjustified. <stdio.h>
is as valid a standard header in C++ as in C. But yes,
I know, some folks don't know any better.
or, in their anti-C exuberance, for using either.

Let's not go there. :)

But thanks for pointing out my error.
I'll try to pay better attention in the future.

-Mike
 
L

Lawrence Kirby

On Wed, 15 Dec 2004 00:37:38 +0000, Chris Torek wrote:

....
printf("%*d", 2, 5);

prints the value "5" in a ten-character field.

Looks like a 2 character field to me. :)
The field is blank
or zero padded depending on the pad option selected: blank by
default, zero if you use a 0 modifier.)
example output i would want is this:
$********5

There is no standard way to do this. It is easy to build your own
though: just sprintf() the numeric value, and then work with the
string. In this case, to get an integer printed into a ten digit
field and replace leading blanks or zeros with spaces, just do
something like:

char buf[SOME_SIZE]; /* must be at least 11 chars */
int val;
...
sprintf(buf, "%010d", val); /* produces, e.g., 0000000005 */
subst(buf, '0', '*');

where the subst() function reads:

/*
* Do substitutions on leading characters in the given string:
* Replace all occurrences of "from" with "to". (We assume
* from != '\0'.)
*/
void subst(char *s, char from, char to) {
while (*s == from)
*s++ = to;
}

Note that if you print with leading blanks, you will need to subst()
from ' ' instead of '0'. (This trick works either way.)

That depends on whether you want 0 to be output as ********** or
*********0

Lawrence
 
C

Chris Torek

Looks like a 2 character field to me. :)

Oops. Hasty posting....
That depends on whether you want 0 to be output as ********** or
*********0

Right, something else I managed to forget to bring up. And if this
is intended for printing money-amounts, one may have to fiddle with
negative numbers as more special cases.
 
M

Mike Wahler

Chris Torek said:
Oops. Hasty posting....

I noticed it too, but realized it was merely a typo.
I didn't want to 'pick on' someone whose contributions
here I so highly value. :)
Right, something else I managed to forget to bring up. And if this
is intended for printing money-amounts, one may have to fiddle with
negative numbers as more special cases.

While I did not test exhaustively, the example I posted allows
for the '-' character for negative values.

-Mike
 
C

Chris Torek

While I did not test exhaustively, the example I posted allows
for the '-' character for negative values.

Well, yes; but I was referring to accountants' desire to print
negative numbers in parentheses, or with the minus sign at the
end, or with a "CR" (credit) or "DB" (debit) suffix, e.g.:

Your Bill

item 1 $***123.45
item 2 $****27.72 CR
total $****95.73

(I always thought these were obnoxious, myself. But my early
training was all mathematics rather than accounting. :) )
 
M

Mike Wahler

Chris Torek said:
Well, yes; but I was referring to accountants' desire to print
negative numbers in parentheses, or with the minus sign at the
end, or with a "CR" (credit) or "DB" (debit) suffix, e.g.:

Your Bill

item 1 $***123.45
item 2 $****27.72 CR
total $****95.73

Oh, OK.
(I always thought these were obnoxious, myself. But my early
training was all mathematics rather than accounting. :) )

Well, I'm in the opposite 'camp'. All my early programming
learning was in the context of business applications (my first
HLL was COBOL :) ), and yes, I had to deal with the forms
(value), valueCR, and value- as well. Since OP didn't give
context, I 'defaulted' to the 'simpler' -value. I suppose
the leading asterisks should have been a clue, though. :)

Aside: One of the accounting oriented things I've done which
I found fun was converting a number to English (e.g. 3125 to
"Three thousand, one hundred twenty-five") for printing bank
drafts. :)

I do wish I'd learned more math, though. (I struggle with other
than very simple graphics). I'm doing what I can to rectify that
problem when I have time.

Anyway, I'd like to take this opportunity to personally thank
you for all your valuable contributions here. I feel I'm
better with C because of you (and others here). :)

-Mike
 
L

lawrence.jones

Chris Torek said:
Well, yes; but I was referring to accountants' desire to print
negative numbers in parentheses, or with the minus sign at the
end, or with a "CR" (credit) or "DB" (debit) suffix, e.g.:

Or, even more obnoxiously, simply printing them in red, a practice which
thankfully went out of fashion when monochrome copiers became prevalent.

-Larry Jones

I've got an idea for a sit-com called "Father Knows Zilch." -- Calvin
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,888
Messages
2,569,964
Members
46,294
Latest member
HollieYork

Latest Threads

Top