当前位置: 代码迷 >> C语言 >> Printf的实现
  详细解决方案

Printf的实现

热度:735   发布时间:2008-05-05 20:15:01.0
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]]
搜索更多相关的解决方案: Printf  
本帖最近评分记录
2008-05-05 12:15:01
jxt598598

等 级:新手上路
帖 子:149
专家分:0
注 册:2007-6-13
  得分:0 
顶顶!
----------------解决方案--------------------------------------------------------
暂时还看不懂,怎么办???
----------------解决方案--------------------------------------------------------
不用怎么办,先看了再说,收藏收藏!
----------------解决方案--------------------------------------------------------
20啊……这么说如果%。。。长度超过二十,程序不就崩溃了 ??
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]StarWing83[/un] 在 2008-5-6 00:34 的发言:[/bo]

20啊……这么说如果%。。。长度超过二十,程序不就崩溃了 ??

只是随便写了一下,没怎么设计

另外这个20不是指的格式输出的长度为20,而是指格式输出中连续出现H的次数有20次,吃饭没事的人都不会去连续写20个H用来表达一个短整形数据的输出
----------------解决方案--------------------------------------------------------
额……刚刚看了一下CString的源代码,FormatV,和printf一样的东西,那个寒啊……Orz
话说,%后面不止有h吧?诸如#,*,m.n,l等等……都这样岂不是很累?
printf的源码非常强悍:它总共就5行,调用了一个叫做output_l的函数而已……………………
----------------解决方案--------------------------------------------------------
厉害啊
----------------解决方案--------------------------------------------------------
  相关解决方案