在编写之前请参考【可变参数列表】
printf函数原型:
int printf( const char *format [, argument]... );
问题:
- 怎么让函数知道传了多少个参数?由函数%的个数知道;
- 要知道每个参数的类型?通过%后面的字符知道;
- printf(“%d%x%c%f”);里面%在printf眼里就是字符串;这是第一个参数,所以整个函数就是对第一个参数字符串进行分析,遇到%特殊处理
- printf返回值根本是字符;
- case中,调用函数,定义变量需要用花括号包含。
编写代码:
实现输出整形,字符,字符串。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<stdarg.h> #include<assert.h> 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 \nhello %c,hello %s", int_max(5, a, b, c, d, e), 'a', "world!"); system("pause"); return 0; }由上面可以知道
printf输出都是按字符输出。