Printf的实现
程序代码:
#include
int main()
{
printf("%hhh");
return 0;
}就是上面的代码,在VC++与C-FREE上运行没有结果显示,而在TURBOC上显示的结果则为%hhh
请问下这是为什么?
哪个结果才是正确的呢?
这个问题的原因是因为几种编译器对printf函数的实现不同,下面我对这两种情况分别进行了实现
1.DEV_C++,VC++ 6.0,VS200X.....
程序代码:
#include
#include
#include
#include
void Put_Char(int ch)
{
putchar(ch);
}
void Put_Int(int n)
{
char *p,str[20];
itoa(n,str,10);
p=str;
while(*p)
{
Put_Char(*p++);
}
}
int Print(const char *format,...)
{
va_list arg_ptr;
va_start(arg_ptr,format);
while(*format)
{
switch(*format)
{
case('%'):
format++;
switch(*format)
{
case('h'):
RE:
format++;
switch(*format)
{
case('d'):
Put_Int(va_arg(arg_ptr,short));
break;
default:
if(*(format+1)=='h'||*(format+1)=='d')
{
{
goto RE;
}
}
else
{
if(*format!='h')
Put_Char(*format);
break;
}
};
break;
case('d'):
Put_Int(va_arg(arg_ptr,int));
break;
};
break;
default:
Put_Char(*format);
};
format++;
}
va_end(arg_ptr);
return 0;
}
int main()
{
int a=65535;
Print("%hhhhss%hsshhhd%hhhhd%d%hhhhh",a,a);
return 0;
}
2.TC,GCC
程序代码:
#include
#include
#include
#include
void Put_Char(int ch)
{
putchar(ch);
}
void Put_Int(int n)
{
char *p,str[20];
itoa(n,str,10);
p=str;
while(*p)
{
Put_Char(*p++);
}
}
void Put_Str(char *str)
{
while(*str)
{
Put_Char(*str++);
}
}
int Print(const char *format,...)
{
va_list arg_ptr;
va_start(arg_ptr,format);
char str[20]={0},flag=0;
while(*format)
{
switch(*format)
{
case('%'):
str[flag++]=*format;
format++;
switch(*format)
{
case('h'):
str[flag++]=*format;
RE:
format++;
switch(*format)
{
case('d'):
Put_Int(va_arg(arg_ptr,short));
memset(str,0,20);
flag=0;
break;
default:
str[flag++]=*format;
if(*(format+1)=='h'||*(format+1)=='d')
{
goto RE;
}
else
{
Put_Str(str);
memset(str,0,20);
flag=0;
break;
}
};
break;
case('d'):
Put_Int(va_arg(arg_ptr,int));
break;
};
break;
default:
Put_Char(*format);
};
format++;
}
va_end(arg_ptr);
return 0;
}
int main()
{
int a=65535;
Print("%hhhhss%hsshhhd%hhhhd%d%hhhhh",a,a);
return 0;
}
以上仅仅为解决引用中的题目问题,只对u,d进行了处理,而没有像printf那样处理其它的,有兴趣的可以自己去实现.
PS:
printf的实现并不是利用va变量来实现的,但基本原理相同
[[it] 本帖最后由 PcrazyC 于 2008-5-6 01:12 编辑 [/it]]
搜索更多相关的解决方案:
Printf
死了都要C
+5
广告/枪文
2008-5-6 11:44