Printf的部分实现

作者在 2009-04-12 11:35:49 发布以下内容

[quote][code]#include <stdio.h>
int main()
{
    printf("%hhh");
    return 0;
}[/code]就是上面的代码,在VC++与C-FREE上运行没有结果显示,而在TURBOC上显示的结果则为%hhh
请问下这是为什么?
哪个结果才是正确的呢?[/quote]

这个问题的原因是因为几种编译器对printf函数的实现不同,下面我对这两种情况分别进行了实现

1.DEV_C++,VC++ 6.0,VS200X.....
[code]
#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))
                    {
                        if(*(format+1)=='%')
                        {
                            break;
                        }
                        else
                        {
                            goto RE;
                        }
                    }
                    else
                    {
                        
                        
                        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("%hhhh%hhhhd%d%hhhhh",a,a);
    return 0;
    
}
[/code]

2.TC,GCC

[code]
#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,int));
                memset(str,0,20);
                flag=0;
                break;
            default:  
                str[flag++]=*format;
                if(*(format+1))
                {
                    if(*(format+1)=='%')
                    {
                        Put_Str(str);
                        memset(str,0,20);
                        flag=0;
                    }
                    else
                    {
                        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("%hhhh%hhhhd%d%hhhhh",a,a);
    return 0;
   
}

[/code]


以上仅仅为解决引用中的题目问题,只对u,d进行了处理,而没有像printf那样处理其它的,有兴趣的可以自己去实现.

原创 | 阅读 2901 次
文章评论,共1条
Donald_Dream
2009-04-12 14:35
1
弄个没用的注释干吗,看起来很累
游客请输入验证码
浏览190830次