不使用man 3 printf的函数,实现一个简单的printf函数


题目:不使用man printf中的函数,实现一个简易的输出函数myprintf。

函数声明:int myprintf(const char *format,...);

要求该函数可以识别(只需要识别)出format字符串中的%ld,%lf,%c,%s这四个转义字符,并转化成相应的参数。

说明:man printf中的函数即:printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf

实现代码:

  1. #include <stdio.h>   
  2. #include <stdarg.h>   
  3. #include <stdlib.h>   
  4.   
  5. //输出一段普通的字符串   
  6. int PrintStr(const char *format)  
  7. {  
  8.     const char *pos = format;  
  9.     int len = 0;  
  10.     while( *pos )  
  11.     {  
  12.         putchar( (int)*(pos++) );  
  13.         len++;  
  14.     }  
  15.     return len;  
  16. }  
  17.   
  18. int MyPrintf(const char *format, ...)  
  19. {  
  20.     const char *pos = format;  
  21.     int len, sublen;  
  22.     len = 0;  
  23.     va_list vlist;  
  24.     va_start(vlist, format);  
  25.   
  26.     while( *pos )  
  27.     {  
  28.         char ch = *pos;  
  29.         if( ch != '%' )  
  30.         {  
  31.             putchar( ch );  
  32.             sublen = 1;  
  33.             pos++;  
  34.         }  
  35.         //处理转义字符   
  36.         else  
  37.         {  
  38.             char nch = *(pos+1);  
  39.             //处理单字符转义   
  40.             if'c' == nch )  
  41.             {  
  42.                 char tch = va_arg(vlist, char);  
  43.                 putchar(tch);  
  44.                 pos += 2;  
  45.                 sublen = 1;  
  46.             }  
  47.             //处理字符串转义   
  48.             else if's' == nch )  
  49.             {  
  50.                 char *tstr = va_arg(vlist, char*);  
  51.                 sublen = PrintStr(tstr);  
  52.                 pos += 2;  
  53.             }  
  54.             else if'l' == nch )  
  55.             {  
  56.                 char nnch = *(pos + 2);  
  57.                 //处理整形数据转义   
  58.                 if'd' == nnch )  
  59.                 {  
  60.                     long tnum = va_arg(vlist, long);  
  61.                     char tstr[21];  
  62.                     _ltoa(tnum, tstr, 10);  
  63.                     sublen = PrintStr(tstr);  
  64.                     pos += 3;  
  65.                 }  
  66.                 //处理浮点形数据转义   
  67.                 else if'f' == nnch )  
  68.                 {  
  69.                     double tnum = va_arg(vlist, double);  
  70.                     char tstr[101];  
  71.                     gcvt(tnum, 10, tstr);  
  72.                     sublen = PrintStr(tstr);  
  73.                     pos += 3;  
  74.                 }  
  75.                 else  
  76.                 {  
  77.                     putchar('l');  
  78.                     putchar(nnch);  
  79.                     pos += 3;  
  80.                 }  
  81.   
  82.   
  83.             }  
  84.             //处理两个%的情况   
  85.             else if'%' == nch )  
  86.             {  
  87.                 putchar('%');  
  88.                 pos += 2;  
  89.                 sublen = 1;  
  90.             }  
  91.             else  
  92.             {  
  93.                 pos++;  
  94.                 sublen = 0;  
  95.             }  
  96.         }  
  97.           
  98.         len += sublen;  
  99.     }  
  100.     va_end(vlist);  
  101.   
  102.     return len;  
  103. }  
  104.   
  105. int main()  
  106. {  
  107.     int rr = MyPrintf("%ld, %lf, %c, %s\n",   
  108.         456, 43.34, 'A'"hello, world");  
  109.     printf("%d\n", rr);  
  110.     return 0;  
  111. }  

如果大家发现我这个程序的BUG的话,欢迎提出,大家共同学习。

相关内容