模拟实现printf函数。

2019-04-15 12:20发布

在编写之前请参考【可变参数列表

printf函数原型:

int printf( const char *format [, argument]... );

问题:

  • 怎么让函数知道传了多少个参数?由函数%的个数知道;
  • 要知道每个参数的类型?通过%后面的字符知道;
  • printf(“%d%x%c%f”);里面%在printf眼里就是字符串;这是第一个参数,所以整个函数就是对第一个参数字符串进行分析,遇到%特殊处理
  • printf返回值根本是字符;
  • case中,调用函数,定义变量需要用花括号包含。
编写代码:
实现输出整形,字符,字符串。#define _CRT_SECURE_NO_WARNINGS 1 #include #include #include #include int int_max(int n, ...) { va_list arg; va_start(arg, n); int max = va_arg(arg, int); int i = 2; int mid = 0; while (i <= n) { mid = va_arg(arg, int); if (max < mid) { max = mid; } i++; } return max; va_end(arg); } void print(int num) { if (num > 9) { print(num / 10); } putchar(num % 10 + '0'); } int my_printf(const char *format, ...) { assert(format); va_list arg; va_start(arg, format); const char *p = format; while (*p) { if (*p == '%') { p++; switch (*p) { case 'd': { int d = va_arg(arg, int); //对整形数据访问 print(d);//按字符打印数据,递归 } break; case 'c': { char c = va_arg(arg, char); //对字符访问 putchar(c); } break; case 's': { char *s = va_arg(arg, char *); puts(s);//最后自动换行 /*while (*s) { putchar(*s); s++; }*/ } break; default: break; } } else { putchar(*p); } p++; } return 0; va_end(arg); } int main() { int a = 1, b = 2, c = 6, d = 72, e = 7; my_printf("hello %d hello %c,hello %s", int_max(5, a, b, c, d, e), 'a', "world!"); system("pause"); return 0; }由上面可以知道
printf输出都是按字符输出。