473,480 Members | 1,864 Online
Bytes | Software Development & Data Engineering Community
Create Post

Home Posts Topics Members FAQ

printf padding with alternate character?

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
13 22510
"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
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 (40°39.22'N, 111°50.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
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

"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
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

"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
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
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
>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 (40°39.22'N, 111°50.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
"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
>"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 (40°39.22'N, 111°50.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

"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
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 thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

9
7008
by: Adrian Neumeyer | last post by:
Hello folks, I have a simple question: I want to control the indentation of strings printed out with printf(...). Not just a fixed indentation, but lets say one blank character more for each...
7
96250
by: teachtiro | last post by:
Hi, 'C' says \ is the escape character to be used when characters are to be interpreted in an uncommon sense, e.g. \t usage in printf(), but for printing % through printf(), i have read that %%...
9
2613
by: Erik Leunissen | last post by:
L.S. I've observed unexpected behaviour regarding the usage of the '#' flag in the conversion specification in the printf() family of functions. Did I detect a bug, or is there something wrong...
31
2587
by: DeltaOne | last post by:
#include<stdio.h> typedef struct test{ int i; int j; }test; main(){ test var; var.i=10; var.j=20;
29
17489
by: whatluo | last post by:
Hi, c.l.cs I noticed that someone like add (void) before the printf call, like: (void) printf("Timeout\n"); while the others does't. So can someone tell me whether there any gains in adding...
0
3106
by: Phil C. | last post by:
(Cross post from framework.aspnet.security) Hi. I testing some asp.net code that generates a 256 bit Aes Symmetric Key and a 256 bit entropy value. I encrypt the Aes key(without storing it as...
5
24348
by: Bilgehan.Balban | last post by:
Hi, I use %#08x to print unsigned integers in hexadecimal format. According to C ref. man. Harbison & Steele, #08 stands for "pad the number with up to 8 zeroes to complete it to 8 digit...
1
1756
by: Dino Viehland | last post by:
I'm assuming this is by-design, but it doesn't appear to be documented: >>> '%8.f' % (-1) ' -1' >>> '%#8.f' % (-1) ' -1.' The docs list the alternate forms, but there isn't one...
6
2812
by: John Messenger | last post by:
I notice that the C standard allows padding bits in both unsigned and signed integer types. Does anyone know of any real-world examples of compilers that use padding bits? -- John
0
7059
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
5362
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
1
4799
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
4499
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
0
3011
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The...
0
3003
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
0
1311
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...
1
572
muto222
php
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
0
203
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.