一个简化的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 int
30 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 }

 

posted on 2014-11-24 21:40  丝工木每  阅读(829)  评论(0编辑  收藏  举报

导航