[lug] variable args

Holshouser, David dholshou at ball.com
Fri May 4 14:43:13 MDT 2001


I found the 'correct' way to do this.
Without your 'vprintf' knowledge, I would never have found vsprintf.
vsprintf does variable arguments in the style of printf but to a string like
sprintf.
Now I can do the following.
Yay!

myfunc(fmt, ...){
  logStuff();        // my logging
  vsprintf(str, ap)  // make ready for printing
  logMsg(str);       // follow their guidelines with replacement for printf.
}



#include "debug_aid.h"

void ErrMsg(char* fmt, ...)
{ 
  va_list ap;
  char str[128];

  va_start(ap, fmt);
  vsprintf(str, fmt, ap);
  printf(str);
  va_end(ap);
}  // ErrMsg()

void StatMsg(char* fmt, ...)
{ 
  va_list ap;
  char str[128];

  va_start(ap, fmt);
  vsprintf(str, fmt, ap);
  printf(str);
  va_end(ap);
}  // StatMsg()




int main(void)
{
	char foo='c';
	StatMsg("%d:%d:%1.1f:%c\n", 2, 3, 4.0, foo);
	ErrMsg("%f\n", 5.0);
}

> -----Original Message-----
> From: D. Stimits [mailto:stimits at idcomm.com]
> Sent: Friday, May 04, 2001 1:51 PM
> To: lug at lug.boulder.co.us
> Subject: Re: [lug] variable args
> 
> 
> Out of curiosity, I'm wondering what would happen if you did 
> not buffer?
> printf() buffers since it uses stdout, but if you instead try 
> fprintf()
> and print to stderr, buffering is removed. Buffering could be doing
> something odd that stderr would not act odd with. I am also 
> curious why
> vprintf can't be used?
> 
> Also, you might want to temporarily alter the "test" function 
> so that it
> does not use the "fmt" argument directly; instead, strcpy (or strncpy)
> fmt to a temporary buffer; I suggest this because for testing you want
> to be guaranteed that "fmt" can't be changed to point at something
> different as things go along, and a separate copy will guarantee the
> variable argument setup does not change it.
> 
> D. Stimits, stimits at idcomm.com
> 
> "Holshouser, David" wrote:
> > 
> > FYI
> > 
> > Calling va_arg(ap, va_list) only seems to return the first 
> argument in the
> > original list.
> > And it turns out that I can't use vprint (or printf for 
> that matter).
> > Back to the drawing board.
> > 
> > The following code produces:
> > 1 2 3
> > 1 1627655920 144
> > 
> > #include<stdio.h>
> > #include<stdarg.h>
> > 
> > void test(char *fmt, ...)
> > {
> >     va_list ap;
> >     va_start(ap, fmt);
> >     vprintf(fmt, ap);
> >     printf( fmt, va_arg( ap, va_list ) );
> >     va_end(ap);
> > }
> > 
> > int main (void)
> > {
> >     test("%d %d %d\n", 1, 2, 3);
> > }
> > 
> > --
> > David Holshouser
> > Engineer I
> > Ball Aerospace & Technologies Corp.
> > (303)939-5085  dholshou at ball.com
> > 
> > _______________________________________________
> > Web Page:  http://lug.boulder.co.us
> > Mailing List: http://lists.lug.boulder.co.us/mailman/listinfo/lug
> _______________________________________________
> Web Page:  http://lug.boulder.co.us
> Mailing List: http://lists.lug.boulder.co.us/mailman/listinfo/lug
> 



More information about the LUG mailing list