Printf的实现
程序代码:
#include <stdio.h> int main() { printf("%hhh"); return 0; }就是上面的代码,在VC++与C-FREE上运行没有结果显示,而在TURBOC上显示的结果则为%hhh
请问下这是为什么?
哪个结果才是正确的呢?
这个问题的原因是因为几种编译器对printf函数的实现不同,下面我对这两种情况分别进行了实现
1.DEV_C++,VC++ 6.0,VS200X.....
程序代码:
#include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h> 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<stdio.h> #include<stdlib.h> #include<stdarg.h> #include<string.h> 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]]