#include void foo(char *fmt, ...);
void show_hex(char *s , int d);
void main()
{
char buf[256]={0};
buf[0] = 0;
buf[1] = 0;
buf[2] = 1;
strcpy(buf+3, "ABCDSKKKKKLLLLKKKASKK");
foo("buffer at %p size %d:", buf, sizeof(buf), buf, 56);
}
void foo(char *fmt, ...) {
va_list ap;
int d;
char c, *s;
va_start(ap, fmt);
while (*fmt)
{
if (*fmt =='%')
{
switch(*(++fmt)) {
case 's': /* string */
s = va_arg(ap, char *);
printf("%s", s);
break;
case 'p':
s = va_arg(ap, char *);
printf("%04X", (int)s);
break;
case 'd': /* int */
d = va_arg(ap, int);
printf("%d", d);
break;
case 'c': /* char */
/* need a cast here since va_arg only
takes fully promoted types */
c = (char) va_arg(ap, int);
printf("%c", c);
break;
}
}
else
printf( "%c", *fmt);
fmt++;
}
s = va_arg(ap, char *);
d = va_arg(ap, int);
show_hex(s,d);
va_end(ap);
}
void show_hex(char *s , int d)
{
for (int i =0 ; i< d ; i++)
{
printf("{%02X} ", (unsigned char)*(s+i));
}
printf("\n");
}