免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2377 | 回复: 6
打印 上一主题 下一主题

printf 实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-28 15:54 |只看该作者 |倒序浏览
printf 函数实现,代码仅供参考

#include <stdarg.h>
/***
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);
***/

void xPrintf(int LEVEL, const char* format, ...);
void xPrintf(int LEVEL, const char* format, ...)
{
        va_list        ap;
        va_start(ap, format);

        char buf[4096];
        char *p = buf;

        const char *f = format;
        while (*f != '\0')
        {
                if (*f != '%')
                {
                        *p++ = *f++;
                        continue;
                }

                ++f;
                int value;
                char *pl;
                char *pr;
                char *tmp;
                switch(*f++) {
                case 'd':
                        value = va_arg(ap, int);
                        if (value < 0)
                        {
                                *p++ = '-';
                                value = ~value;
                        }

                        pl = p;
                        do {
                                *p++ = value%10+'0';
                        } while ((value /=10) > 0);
                        pr = p-1;

                        // swap
                        while(pr-pl > 0)
                        {
                                char t = *pl;
                                *pl = *pr;
                                *pr = t;
                                pl++; pr--;
                        }
                        break;
                case 's':
                        tmp = va_arg(ap, char*);
                        while(*tmp != '\0')
                        {
                                *p++ = *tmp++;
                        }
                        break;
                }
        }
        va_end(ap);
        *p = '\0';

        printf("%s\r\n", buf);
}

论坛徽章:
0
2 [报告]
发表于 2010-01-28 16:09 |只看该作者
printf应该用到底层的东西吧!好像汇编等!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2010-01-28 16:25 |只看该作者
应该说是可变参数的用法

论坛徽章:
0
4 [报告]
发表于 2010-02-02 13:52 |只看该作者
楼上说的极是..

论坛徽章:
0
5 [报告]
发表于 2010-02-02 14:01 |只看该作者
唉,lz去参与glibc的开发吧

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
6 [报告]
发表于 2010-02-02 15:37 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
7 [报告]
发表于 2010-02-02 20:04 |只看该作者
我大学时候看的UNIX6的代码,

里面调用的是putchar, getchar更地层的调用,再下面才是汇编

,我说的printf是内核调用,跟库概念有点不同,

代码量大约200行
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP