关闭

printf源代码的分析

155人阅读 评论(0) 收藏 举报
分类:

1、常见的格式

printf"show int: %d, char: %s", int val1, char *val2);
printfconst char *fmt, ...);

2、处理方式

  • 处理过程中主要采用了一个指针va_list 、3个函数 va_start()va_arg()va_end()

  • va_list args; //声明args,用于存储了所有的val1,val2,……,实际上是一个指针而已

  • va_start(args, fmt); // 得到第一个可变参数的地址,(也就是args的地址是从fmt之后开始,也就是”show int: %d, char: %c”之后)

  • int getval1 = va_arg(args, int); // 比如:第一个是int的型,则根据int型获取val1

  • 对fmt字符串进行一个循环操作,如果遇到”%号”,判断并获取数据类型,再通过va_arg()获取数据;

  • 注:int类型如何获取,通过对fmt字符串的判断,根据第一个”%号”后面的字符来确定 第一个参数的类型

  • va_end(args); // 清空args的指针

3、伪代码

printf(const char * fmt, ......)
{
    val_list args;   

    va_start(args, fmt);  // 获取第一个可变参数的地址,

    char *str;

    for(str = buf; *fmt; ++fmt)
    {
        // 如果不等于%继续查找,同时存储于str
        if (*fmt != '%') {
            *str++ = *fmt;
            continue;
        }

        遇到%号后,对%号后面的进行判断, 同时存储于str
        switch()
        case 'd':  va_arg(args, int); // 获取int类型    获取一个参数后,指针移至下一个参数
        case 's':  va_arg(args, char) // 获取char型
        case 'p'   va_arg(args, void *); // 获取指针
    }

    va_end(args);  // 将args指针置空

    最后str字符串就是printf最后的输出结果
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2260次
    • 积分:85
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:4篇
    • 译文:0篇
    • 评论:0条
    文章分类