printf原理及实现

内核中的printk
kernel\printk\printk.c

asmlinkage __visible int printk(const char *fmt, ...)
{
	va_list args;
	int r;

	va_start(args, fmt);
	r = vprintk_func(fmt, args);
	va_end(args);

	return r;
}
EXPORT_SYMBOL(printk);

include\acpi\platform\acgcc.h

typedef __builtin_va_list va_list;
#define va_start(v, l)          __builtin_va_start(v, l)
#define va_end(v)               __builtin_va_end(v)

…再往下还得再分析

printf实现

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

int my_printf(const char* string,...);
 
int main()
{
		int i = 10000;
        my_printf("hello world!\n");
		my_printf("int i = %d, j = %d", i, 10);
		my_printf("char i = %c", 50);
		system("pause") ;
        return 0;
}
 
int my_printf(const char* string,...)
{
 
	char buffer[BUFSIZ] = {0};//Be tolerant with my_printf, never try to jump ovet the band of the buffer -- buffer overflow
 
        int temp = 0;
        va_list arg;
 
        char* p_string = NULL;
        char* p_buffer = buffer;
        char* p_temp   = NULL;
 
        int counter = 0;
        int number  = 0;
        int foo     = 0;

        va_start(arg,string);
 
        for(counter = 0,p_string = string;*(p_string) != '\0';)
        {
                switch(*p_string)
                {
                        case '%':
                                p_string++;
 
                                switch(*p_string)
                                {
                                        case 'd':
                                                temp = va_arg(arg,int);

                                                foo = temp;
 
                                                while(foo)
                                                {
                                                        number++;
                                                        counter++;
                                                        foo /= 10;
                                                }
 
                                                foo = temp;
												temp = number;
                                                while(number)
                                                {
                                                        *(p_buffer+number-1) = (foo%10) + '0';
                                                        foo /= 10;
                                                        number--;
                                                }
												p_buffer += temp;
                                        break;
 
                                        case 'c':
                                                temp = va_arg(arg,int);
                                                *(p_buffer++) = temp;
                                        break;
 
                                        case 's':
                                                p_temp = va_arg(arg,char*);
 
                                                while(p_temp != NULL)
                                                {
                                                        *(p_buffer++) = *(p_temp++);
                                                        counter++;
                                                }
                                        break;
 
                                        default:
                                                break;		
                                }
						p_string++;
                        break;
 
                        default:
                                *(p_buffer++) = *(p_string++);
                                counter++;
                }
        }
 
        va_end(arg);
 
		p_buffer = NULL;
        puts(buffer);
 
        return counter;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值