64,282
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <stdarg.h>
using namespace std;
void my_printf(char *fmt, ...)
{
va_list ap;
char *p, *sval;
int ival;
double dval;
char cval;
va_start(ap, fmt);
for(p=fmt; *p; ++p)
{
if(*p != '%')
putchar(*p);
else
switch(*++p)
{
case 'd':
ival = va_arg(ap, int);
printf("%d", ival);
break;
case 'f':
dval = va_arg(ap, double);
printf("%f", dval);
break;
case 's':
sval = va_arg(ap, char*);
for(; *sval; ++sval)
putchar(*sval);
break;
case 'c':
cval = va_arg(ap, char);
printf("%c", cval);
break;
default:
putchar(*p);
break;
}
}
va_end(ap);
}
int _tmain(int argc, _TCHAR* argv[])
{
int a = 5;
char b = 'm';
my_printf("%d %c", a, b); //依然输出5 m
return 0;
}
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) \
( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#include <iostream>
using namespace std;
void my_printf(char *fmt, ...)
{
char *arg = (char *)(&fmt + 1);
char *p, *sval;
int ival;
double dval;
char cval;
for(p=fmt; *p; ++p)
{
if(*p != '%')
putchar(*p);
else
{
switch(*++p)
{
case 'd':
ival = *(int *)arg;
arg += sizeof(int);
printf("%d", ival);
break;
case 'f':
dval = *(double *)arg;
arg += sizeof(double);
printf("%f", dval);
break;
case 's':
sval = *(char **)arg;
arg += sizeof(char **);
for(; *sval; ++sval)
putchar(*sval);
break;
case 'c':
cval = *(char *)arg;
arg += sizeof(char);//这里因为参数传递时有类型提升,所以此处应该是arg += sizeof(char);,移动一个字节的话就会有问题
printf("%c", cval);
break;
default:
putchar(*p);
break;
}
}
}
}
int main()
{
int a = 5;
char b = 'm';
my_printf("%d %c %c %c %c %c", a, b, b, b, b, b); //这里就会有问题了
system("pause");
return 0;
}
#define va_arg(ap,t) \
( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_arg(ap,t) \
( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
typedef char * va_list;
#define _INTSIZEOF(n) \
((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) \
( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )