打印
[开发工具]

实现一个简易版printf函数

[复制链接]
350|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

实现一个简易版printf函数
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int my_printf(const char *format, ...) {
    va_list ap;
    #define BUF_SIZE (1024)
    #define STR_SIZE (64)
    char buf[BUF_SIZE] = {0};   
    char c;   
    char *pos = buf;   
    va_start(ap, format);   
    while((c = *format)) {        
    if (c == '%') {
            format++;
            c = *format;            
            switch(c) {               
                case 'd':
                    {                        
                        int value = va_arg(ap, int);                        
                        char str[STR_SIZE] = {0};                        
                        sprintf(str, "%d", value);                        
                        memcpy(pos, str, strlen(str));
                        pos += strlen(str);                        
                        break;
                    }               
                case 'u':
                    {                        
                        unsigned int value = va_arg(ap, unsigned int);                        char str[STR_SIZE] = {0};                        sprintf(str, "%u", value);                        memcpy(pos, str, strlen(str));
                        pos += strlen(str);                        
                        break;
                    }               
                 case 'o':
                    {                        
                        unsigned int value = va_arg(ap, unsigned int);                        char str[STR_SIZE] = {0};                        sprintf(str, "%o", value);                        memcpy(pos, str, strlen(str));
                        pos += strlen(str);                        
                        break;
                    }               
                 case 'x':
                    {                        
                        unsigned int value = va_arg(ap, unsigned int);                        char str[STR_SIZE] = {0};                        sprintf(str, "%x", value);                        memcpy(pos, str, strlen(str));
                        pos += strlen(str);                        
                        break;
                    }               
                case 'c':
                    {                        
                        char value = va_arg(ap, int);                        
                        memcpy(pos, &value, 1);
                        pos++;                        
                        break;
                    }                    
                    break;               
                 case 's':
                    {                        
                        char *value = va_arg(ap, char *);                       
                        memcpy(pos, value, strlen(value));
                        pos += strlen(value);                        
                        break;
                    }               
                 case 'p':
                    {                        
                        long long *value = va_arg(ap, long long *);                        char str[STR_SIZE] = {0};                        sprintf(str, "%p", value);                        memcpy(pos, str, strlen(str));
                        pos += strlen(str);                        
                        break;
                    }               
                 case '%':
                    {                        
                        memcpy(pos, &c, 1);
                        pos++;                        
                        break;
                    }               
                 default:
                    {                       
                         printf("format error");                        
                         return -1;
                    }
            }
        } else {            
            memcpy(pos, &c, 1);
            pos++;
        }
        format++;
    }   
    write(2, buf, strlen(buf));   
    return 0;
}
int main(int argc, char *argv[]) {   
    int num = 0;   
    my_printf("%d,%u,%o,%x,%c,%s,%p,%%\n", 1234, 1234, 1234, 1234, 'a', "myprintf", &num);   
    return 0;
}

使用特权

评论回复
沙发
chenqianqian| | 2024-1-19 08:11 | 只看该作者
这个搞复杂了,效率不高。

使用特权

评论回复
板凳
中国龙芯CDX| | 2024-1-24 08:20 | 只看该作者
自己写的程序重在思想

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

192

主题

1899

帖子

1

粉丝