| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2137 人关注过本帖, 1 人收藏
标题:Printf的实现
只看楼主 加入收藏
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
结帖率:100%
收藏(1)
 问题点数:0 回复次数:7 
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]]
收到的鲜花
  • 死了都要C2008-05-06 11:44 送鲜花  5朵   附言:广告/枪文
搜索更多相关主题的帖子: Printf 
2008-05-05 20:15
jxt598598
Rank: 1
等 级:新手上路
帖 子:149
专家分:0
注 册:2007-6-13
收藏
得分:0 
顶顶!

qq:304742297
2008-05-05 21:10
yzh0673
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-4-5
收藏
得分:0 
暂时还看不懂,怎么办???
2008-05-05 21:23
思考ING
Rank: 1
来 自:重庆
等 级:新手上路
帖 子:140
专家分:0
注 册:2008-3-12
收藏
得分:0 
不用怎么办,先看了再说,收藏收藏!

天生孤独的思考~~~~~~~~~
2008-05-05 22:18
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
20啊……这么说如果%。。。长度超过二十,程序不就崩溃了 ??

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-06 00:34
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
[bo]以下是引用 [un]StarWing83[/un] 在 2008-5-6 00:34 的发言:[/bo]

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

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

另外这个20不是指的格式输出的长度为20,而是指格式输出中连续出现H的次数有20次,吃饭没事的人都不会去连续写20个H用来表达一个短整形数据的输出

雁无留踪之意,水无取影之心
2008-05-06 01:16
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
额……刚刚看了一下CString的源代码,FormatV,和printf一样的东西,那个寒啊……Orz
话说,%后面不止有h吧?诸如#,*,m.n,l等等……都这样岂不是很累?
printf的源码非常强悍:它总共就5行,调用了一个叫做output_l的函数而已……………………

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-06 01:46
daijia
Rank: 1
来 自:沈阳
等 级:新手上路
帖 子:56
专家分:0
注 册:2008-5-9
收藏
得分:0 
厉害啊
2008-05-18 09:22
快速回复:Printf的实现
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028056 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved