其实很久之前就想问C语言里面的printf()是怎么实现的,
主要是对printf()的参数比较感兴趣,
你想我们随便定义一个函数,都得确定参数的个数,
但是像printf()函数,可以根据第一个参数也就是字符串”%c %d %f %s”根据有多少个格式输入来确认参数的个数。
于是我去了解到了一种叫变参函数的东西,在stdarg.h里面定义有,在加上简单的字符串合成,最后用putchar()函数来输出,简单实现了My_printf();

代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h>
char * int_to_str(int num); void My_printf(char *fmt, ...);
int main(int argc,char **argv) { My_printf("%s %d %c %s %f","hello",666,'A',"sadasd",123.52); getchar(); return 0; }
char * int_to_str(int num) { char * str = (char *)malloc(sizeof(char) * 20); itoa(num,str,10); return str; }
void My_printf(char *format, ...) { int str_len;
va_list valist; int data_integer; char data_character; char * data_String; double data_float;
char str[100] = ""; char * str_i = str;
va_start(valist, format); while(*format) { if(*format == '%') { switch(*(format + 1)) { case 's': data_String = va_arg(valist, char *); strcat(str,data_String); break; case 'd': data_integer = va_arg(valist, int); char *temp = int_to_str(data_integer); strcat(str,temp); free(temp); break; case 'f': data_float = va_arg(valist, double); char temp_arr[20]; sprintf(temp_arr,"%lf",data_float); strcat(str,temp_arr); break; case 'c': data_character = (char) va_arg(valist, int); int str_len = strlen(str); str[str_len] = data_character; str[str_len + 1] = '\0'; break; default: break; } *format++; } else { str_len = strlen(str); str[str_len] = *format; str[str_len + 1] = '\0'; } *format++; } va_end(valist);
int i = 0; while(str[i] != '\0') putchar(str[i++]); }
|
这个代码其实还是有很多的不足,比如说“%.2f”可以实现打印保留两位小数的浮点数,还比如“\n”可以实现换行打印。