[开发工具] 实现一个简易版printf函数

[复制链接]
584|2
 楼主| 小小蚂蚁举千斤 发表于 2024-1-18 21:00 | 显示全部楼层 |阅读模式

实现一个简易版printf函数
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. int my_printf(const char *format, ...) {
  7.     va_list ap;
  8.     #define BUF_SIZE (1024)
  9.     #define STR_SIZE (64)
  10.     char buf[BUF_SIZE] = {0};   
  11.     char c;   
  12.     char *pos = buf;   
  13.     va_start(ap, format);   
  14.     while((c = *format)) {        
  15.     if (c == '%') {
  16.             format++;
  17.             c = *format;            
  18.             switch(c) {               
  19.                 case 'd':
  20.                     {                        
  21.                         int value = va_arg(ap, int);                        
  22.                         char str[STR_SIZE] = {0};                        
  23.                         sprintf(str, "%d", value);                        
  24.                         memcpy(pos, str, strlen(str));
  25.                         pos += strlen(str);                        
  26.                         break;
  27.                     }               
  28.                 case 'u':
  29.                     {                        
  30.                         unsigned int value = va_arg(ap, unsigned int);                        char str[STR_SIZE] = {0};                        sprintf(str, "%u", value);                        memcpy(pos, str, strlen(str));
  31.                         pos += strlen(str);                        
  32.                         break;
  33.                     }               
  34.                  case 'o':
  35.                     {                        
  36.                         unsigned int value = va_arg(ap, unsigned int);                        char str[STR_SIZE] = {0};                        sprintf(str, "%o", value);                        memcpy(pos, str, strlen(str));
  37.                         pos += strlen(str);                        
  38.                         break;
  39.                     }               
  40.                  case 'x':
  41.                     {                        
  42.                         unsigned int value = va_arg(ap, unsigned int);                        char str[STR_SIZE] = {0};                        sprintf(str, "%x", value);                        memcpy(pos, str, strlen(str));
  43.                         pos += strlen(str);                        
  44.                         break;
  45.                     }               
  46.                 case 'c':
  47.                     {                        
  48.                         char value = va_arg(ap, int);                        
  49.                         memcpy(pos, &value, 1);
  50.                         pos++;                        
  51.                         break;
  52.                     }                    
  53.                     break;               
  54.                  case 's':
  55.                     {                        
  56.                         char *value = va_arg(ap, char *);                       
  57.                         memcpy(pos, value, strlen(value));
  58.                         pos += strlen(value);                        
  59.                         break;
  60.                     }               
  61.                  case 'p':
  62.                     {                        
  63.                         long long *value = va_arg(ap, long long *);                        char str[STR_SIZE] = {0};                        sprintf(str, "%p", value);                        memcpy(pos, str, strlen(str));
  64.                         pos += strlen(str);                        
  65.                         break;
  66.                     }               
  67.                  case '%':
  68.                     {                        
  69.                         memcpy(pos, &c, 1);
  70.                         pos++;                        
  71.                         break;
  72.                     }               
  73.                  default:
  74.                     {                       
  75.                          printf("format error");                        
  76.                          return -1;
  77.                     }
  78.             }
  79.         } else {            
  80.             memcpy(pos, &c, 1);
  81.             pos++;
  82.         }
  83.         format++;
  84.     }   
  85.     write(2, buf, strlen(buf));   
  86.     return 0;
  87. }
  88. int main(int argc, char *argv[]) {   
  89.     int num = 0;   
  90.     my_printf("%d,%u,%o,%x,%c,%s,%p,%%\n", 1234, 1234, 1234, 1234, 'a', "myprintf", &num);   
  91.     return 0;
  92. }
chenqianqian 发表于 2024-1-19 08:11 来自手机 | 显示全部楼层
这个搞复杂了,效率不高。
中国龙芯CDX 发表于 2024-1-24 08:20 | 显示全部楼层
自己写的程序重在思想
您需要登录后才可以回帖 登录 | 注册

本版积分规则

228

主题

2630

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部