首页 > 代码库 > 一个简化的printf函数

一个简化的printf函数

《C和指针》第7章第5道编程题:

实现一个简化的printf函数,它能够处理%d、%f、%s 和 %c 格式码,根据ANSI标准的原则,其他格式码的行为是未定义的。你可以假定已经存在函数 printf_integer 和 printf_float,用于打印这些类型的值。对于另外两个类型的值,使用 putchar 来打印。

答案参考百度知道

 1 /* 2 ** 实现一个简易的printf函数 3 ** 它能处理%d, %f, %s,%c格式码 4 */ 5  6 #include <stdarg.h>  //处理可变参数列表 7 #include <stdio.h> 8  9 int putchar( int c );10 int printf_int( int i ){;}      // 假定printf_int函数用于打印int类型的值11 int printf_float( float f ){;}  // 假定printf_float函数用于打印float类型的值12 13 int my_printf( char *fmt, ... );14 15 int 16 main()17 {18     my_printf( "integer test: %d\n", 134 );  // 由于printf_int函数是假定的,实际不能打印数值19     my_printf( "float test: %f\n", 0.5 );    // 由于printf_float函数是假定的,实际不能打印数值20     my_printf( "string test: %s\n", "abcdefg" );21     my_printf( "char teat: %c\n", A );22     my_printf( "%d %f %s %c\n", 100, 4.124, "ABC", h );23     return 0;24 }25 26 /*27 ** 函数,实现简易的printf函数28 */29 int30 my_printf( char *fmt, ... )31 {32     va_list prtf_list;33     char *fp;    // 指向fmt字符串34     char *sval;  // 要输出的字符串35     int ival;    // 要输出的整数36     float fval;  // 要输出的浮点数37     char cval;38     39     va_start( prtf_list, fmt );40     41     for( fp = fmt; *fp != \0; ++ fp )42     {43         /*44         ** 如果没遇到%,则直接输出字符45         ** 并处理下一个字符46         */47         if( *fp != % )48         {49             putchar( *fp );50             continue;51         }52         53         /*54         ** 如果遇到%,则看下一个字符55         ** 根据格式输出56         */57         switch( *++fp )58         {59             case d:60                 ival = va_arg( prtf_list, int );   // 从参数列表中获取一个int类型的值61                 printf_int( ival );62                 break;63             case  f:64                 fval = va_arg( prtf_list, double );  // 从参数列表中获取一个float类型的值65                 printf_float( fval );66                 break;67             case s:68                 // 从参数列表中获取一串字符,并逐个输出69                 for( sval = va_arg( prtf_list, char * ); *sval != \0; ++ sval )70                     putchar( *sval );71                 break;72             case c:73                 cval = va_arg( prtf_list, int );    //从参数列表中获取一个字符并输出74                 putchar( cval );  75                 break;76             default:77                 break;78         }79     }80     81     va_end( prtf_list );82     83     return ;84 }

 

一个简化的printf函数