void UserDefinedPrintFun(char* format, int i, ...)
{
va_list arg_ptr;
char *s = NULL;
int *i = NULL;
float *f = NULL;
va_start(arg_ptr, i);
while(*format!='\0')
{
format++;
if(*(format-1)=='%' && *format=='s')
{
s = va_arg(arg_ptr, char*);
……// 输出至屏幕
}
else if(*(format-1)=='%' && *format=='d')
{
i = va_arg(arg_ptr, int*);
……// 输出至屏幕
}
else if(*(format-1)=='%' && *format=='f')
{
f = va_arg(arg_ptr, float*);
……// 输出至屏幕
}
}
va_end(arg_ptr);
return;
}
如果采用下面三种方法调用,合法合理:
UserDefinedPrintFun ("%d", 2010); // 结果2010
UserDefinedPrintFun ("%d%d", 2010,2011); // 结果20102011
UserDefinedPrintFun ("%s%d", "Hello", 2012); // 结果Hello2012
但是,当给定的格式字符串与参数类型不对应时,强制转型这个“怪兽”就会被唤醒,
悄悄地毁坏程序的安全性,这可不是什么高质量的程序,如下所示:
UserDefinedPrintFun ("%d", 2010.80f);
// 结果2010
UserDefinedPrintFun ("%d%d", "Hello", 2012);
// 结果150958722015(这是什么结果???)