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]]

											

	    
