By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
448,495 Members | 1,298 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 448,495 IT Pros & Developers. It's quick & easy.

printf padding with alternate character?

P: n/a
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
Nov 14 '05 #1
Share this Question
Share on Google+
13 Replies


P: n/a
"pb" <gl*****@yahoo.com> writes:
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.
--
Ben Pfaff
email: bl*@cs.stanford.edu
web: http://benpfaff.org
Nov 14 '05 #2

P: n/a
In article <1103068973.18047@sj-nntpcache-3> pb <gl*****@yahoo.com> wrote:
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.)
--
In-Real-Life: Chris Torek, Wind River Systems
Salt Lake City, UT, USA (4039.22'N, 11150.29'W) +1 801 277 2603
email: forget about it http://web.torek.net/torek/index.html
Reading email is like searching for food in the garbage, thanks to spammers.
Nov 14 '05 #3

P: n/a
pb wrote:
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.

--
Peter

Nov 14 '05 #4

P: n/a

"pb" <gl*****@yahoo.com> wrote in message
news:1103068973.18047@sj-nntpcache-3...
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
Nov 14 '05 #5

P: n/a
Mike Wahler wrote:
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.
Nov 14 '05 #6

P: n/a

"Martin Ambuhl" <ma*****@earthlink.net> wrote in message
news:32*************@individual.net...
Mike Wahler wrote:
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?


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
Nov 14 '05 #7

P: n/a
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
Nov 14 '05 #8

P: n/a
Chris Torek <no****@torek.net> wrote:
In article <1103068973.18047@sj-nntpcache-3> pb <gl*****@yahoo.com> wrote: .... printf("%*d", 2, 5); ^^^
10???
prints the value "5" in a ten-character field. The field is blank

^^^
two???
--
Z (zo**********@web.de)
"LISP is worth learning for the profound enlightenment experience
you will have when you finally get it; that experience will make you
a better programmer for the rest of your days." -- Eric S. Raymond
Nov 14 '05 #9

P: n/a
>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.
In article <pa****************************@netactive.co.uk>
Lawrence Kirby <lk****@netactive.co.uk> wrote:
Looks like a 2 character field to me. :-)


Oops. Hasty posting....
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


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.
--
In-Real-Life: Chris Torek, Wind River Systems
Salt Lake City, UT, USA (4039.22'N, 11150.29'W) +1 801 277 2603
email: forget about it http://web.torek.net/torek/index.html
Reading email is like searching for food in the garbage, thanks to spammers.
Nov 14 '05 #10

P: n/a
"Chris Torek" <no****@torek.net> wrote in message
news:cp********@news1.newsguy.com...
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.
In article <pa****************************@netactive.co.uk>
Lawrence Kirby <lk****@netactive.co.uk> wrote:
Looks like a 2 character field to me. :-)


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. :-)
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


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
Nov 14 '05 #11

P: n/a
>"Chris Torek" <no****@torek.net> wrote in message
news:cp********@news1.newsguy.com...
... And if this
is intended for printing money-amounts, one may have to fiddle with
negative numbers as more special cases.

In article <zk**************@newsread3.news.pas.earthlink.net >
Mike Wahler <mk******@mkwahler.net> wrote: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. :-) )
--
In-Real-Life: Chris Torek, Wind River Systems
Salt Lake City, UT, USA (4039.22'N, 11150.29'W) +1 801 277 2603
email: forget about it http://web.torek.net/torek/index.html
Reading email is like searching for food in the garbage, thanks to spammers.
Nov 14 '05 #12

P: n/a

"Chris Torek" <no****@torek.net> wrote in message
news:cp*********@news4.newsguy.com...
"Chris Torek" <no****@torek.net> wrote in message
news:cp********@news1.newsguy.com...
... And if this
is intended for printing money-amounts, one may have to fiddle with
negative numbers as more special cases.

In article <zk**************@newsread3.news.pas.earthlink.net >
Mike Wahler <mk******@mkwahler.net> wrote:
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


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
Nov 14 '05 #13

P: n/a
Chris Torek <no****@torek.net> wrote:

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
Nov 14 '05 #14

This discussion thread is closed

Replies have been disabled for this discussion.