Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C Programming (http://www.velocityreviews.com/forums/f42-c-programming.html)
-   -   printf padding with alternate character? (http://www.velocityreviews.com/forums/t436177-printf-padding-with-alternate-character.html)

pb 12-14-2004 11:58 PM

printf padding with alternate character?
 
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



Ben Pfaff 12-15-2004 12:32 AM

Re: printf padding with alternate character?
 
"pb" <glace99@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: blp@cs.stanford.edu
web: http://benpfaff.org

Chris Torek 12-15-2004 12:37 AM

Re: printf padding with alternate character?
 
In article <1103068973.18047@sj-nntpcache-3> pb <glace99@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.

Peter Nilsson 12-15-2004 01:09 AM

Re: printf padding with alternate character?
 
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


Mike Wahler 12-15-2004 01:49 AM

Re: printf padding with alternate character?
 

"pb" <glace99@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



Martin Ambuhl 12-15-2004 04:45 AM

Re: printf padding with alternate character?
 
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.

Mike Wahler 12-15-2004 05:12 AM

Re: printf padding with alternate character?
 

"Martin Ambuhl" <mambuhl@earthlink.net> wrote in message
news:329tqnF3l8pb9U1@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



Lawrence Kirby 12-15-2004 10:23 AM

Re: printf padding with alternate character?
 
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

Zoran Cutura 12-15-2004 11:55 AM

Re: printf padding with alternate character?
 
Chris Torek <nospam@torek.net> wrote:
> In article <1103068973.18047@sj-nntpcache-3> pb <glace99@yahoo.com> wrote:

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

^^^
10???
>
> prints the value "5" in a ten-character field. The field is blank

^^^
two???
--
Z (zoran.cutura@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

Chris Torek 12-15-2004 06:58 PM

Re: printf padding with alternate character?
 
>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 <pan.2004.12.15.10.23.16.953000@netactive.co.uk>
Lawrence Kirby <lknews@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.


All times are GMT. The time now is 03:53 PM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57