Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > A question about printf

Reply
Thread Tools

A question about printf

 
 
Why Tea
Guest
Posts: n/a
 
      11-17-2006
int printf(const char *fmt,...)

The fmt is const, indicating that it can't be changed during runtime.
If I want to print a series of integers that I only know the largest
value beforehand, instead of testing each range and printf each with
different width (say 1 space + max number of digits) accordingly, is
there a better way of doing it?

/Why Tea

 
Reply With Quote
 
 
 
 
Richard Heathfield
Guest
Posts: n/a
 
      11-17-2006
Why Tea said:

> int printf(const char *fmt,...)
>
> The fmt is const, indicating that it can't be changed during runtime.


No, it means printf won't change it.

Consider this code:

#include <stdio.h>

int main(void)
{
char format[8] = "%Xs";
int i = 9;
while(i > 1)
{
format[1] = i-- + '0';
printf(format, "X\n");
}
return 0;
}

Perfectly legal C, honest!


> If I want to print a series of integers that I only know the largest
> value beforehand, instead of testing each range and printf each with
> different width (say 1 space + max number of digits) accordingly, is
> there a better way of doing it?


Yes, but the best answer to your question depends on precisely what you want
to do. This isn't clear from your question.

Let's take the following data as being your "series of integers":

0 1 10 100 1000 10000

How would you want the output to appear?

--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: normal service will be restored as soon as possible. Please do not
adjust your email clients.
 
Reply With Quote
 
 
 
 
Chris Dollin
Guest
Posts: n/a
 
      11-17-2006
Why Tea wrote:

> int printf(const char *fmt,...)
>
> The fmt is const, indicating that it can't be changed during runtime.


No, the *fmt's are const, indicating that /printf/ won't change them when
it's called.

> If I want to print a series of integers that I only know the largest
> value beforehand, instead of testing each range and printf each with
> different width (say 1 space + max number of digits) accordingly, is
> there a better way of doing it?


I don't understand what you're asking for. Examples? And have you
read up on what the printf format options are -- including the
* magic number?

--
Chris "hantwig efferko VOOM!" Dollin
"- born in the lab under strict supervision -", - Magenta, /Genetesis/

 
Reply With Quote
 
Why Tea
Guest
Posts: n/a
 
      11-17-2006

Richard Heathfield wrote:
> Why Tea said:
>
> > int printf(const char *fmt,...)
> >
> > The fmt is const, indicating that it can't be changed during runtime.

>
> No, it means printf won't change it.
>
> Consider this code:
>
> #include <stdio.h>
>
> int main(void)
> {
> char format[8] = "%Xs";
> int i = 9;
> while(i > 1)
> {
> format[1] = i-- + '0';
> printf(format, "X\n");
> }
> return 0;
> }
>
> Perfectly legal C, honest!
>
>
> > If I want to print a series of integers that I only know the largest
> > value beforehand, instead of testing each range and printf each with
> > different width (say 1 space + max number of digits) accordingly, is
> > there a better way of doing it?

>
> Yes, but the best answer to your question depends on precisely what you want
> to do. This isn't clear from your question.
>
> Let's take the following data as being your "series of integers":
>
> 0 1 10 100 1000 10000
>
> How would you want the output to appear?


Thanks Richard. You have actually answered my question. But I will
still give you an example and I would like to see your solution

1) 1, 3 , 4, 12, 56, 67 => 001, 003, 004, 056, 067
2) 1, 3, 4, 112 => 0001, 0003, 0004, 0012
3) 1, 3, 4, 1122 => 00001, 00003, 00004, 01122

We can also assume the numbers are store in an int array.

 
Reply With Quote
 
Richard Heathfield
Guest
Posts: n/a
 
      11-17-2006
Why Tea said:

<snip>
>
> Thanks Richard. You have actually answered my question. But I will
> still give you an example and I would like to see your solution
>
> 1) 1, 3 , 4, 12, 56, 67 => 001, 003, 004, 056, 067
> 2) 1, 3, 4, 112 => 0001, 0003, 0004, 0012
> 3) 1, 3, 4, 1122 => 00001, 00003, 00004, 01122
>
> We can also assume the numbers are store in an int array.


You also said you knew the largest number. So the next step is to calculate
how many digits it has. Once you've done that:

for(i = 0; i < n; i++)
{
printf("%0*d\n", digits + 1, data[n]);
}

The 0 means "pad to the left with 0s".
The * means "make this field as wide as... well, read a parameter to find
out, okay?" (I was amazed and delighted when I first discovered this
feature of printf.)
The d, of course, you know already.

--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: normal service will be restored as soon as possible. Please do not
adjust your email clients.
 
Reply With Quote
 
Why Tea
Guest
Posts: n/a
 
      11-17-2006
>
> for(i = 0; i < n; i++)
> {
> printf("%0*d\n", digits + 1, data[n]);
> }
>
> The 0 means "pad to the left with 0s".
> The * means "make this field as wide as... well, read a parameter to find
> out, okay?" (I was amazed and delighted when I first discovered this
> feature of printf.)


I know how you felt. I've just experienced that. Thanks for sharing!

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
printf affects following printf/s azza C Programming 0 10-17-2010 09:43 AM
Extracting printf(...) from (void) printf(....) guru Perl Misc 8 02-03-2009 10:37 PM
(void) printf vs printf whatluo C Programming 29 09-08-2005 05:42 PM
bus error with printf line included, error without printf line? ben C Programming 4 06-26-2004 04:42 PM
Question about evaluating the arguments of printf (maybe OT?) Edith Gross C++ 2 11-02-2003 12:16 PM



Advertisments