我也来写一个类printf函数(一道深信服的笔试题)

记起上次深信服的一道考题,叫我们实现一个与printf功能相似的函数,也就是可变参数个数的函数问题,当时压根就无从下手。刚在网上搜了一下,果然有所收获。多说无益,动手写了个程序实例,感兴趣的朋友可以看看:

 

#include  < iostream >
#include 
< conio.h >
#include 
< stdio.h >
#include 
< stdarg.h >   // 定义av_list、av_start、av_arg等宏
/*
******************************************************************
此函数的作用:
    实现一个参数个数可变的函数,此函数的功能与printf类似,
    但在格式处理上,不如printf丰富
    无异常,返回一个true,否则返回false
format字符串的合法情况如下:
    1."%%zyk%%zyk%%",OUTPUT:%zyk%zyk%
    2."%dzyk%fzyk%s",OUTPUT:(int)zyk(float)zyk(string)
    3."zyk",    OUTPUT:zyk
非法情况如下:
    1."%zyk%"    ERROR:不存在%z格式、%后面必须跟一个格式字符
******************************************************************
*/
bool  zykPrintf( const   char   *  format,...)
{
    
// 定义一个可用于指向参数的指针(实为char *),
    va_list argPtr;

    
// 把函数的第一个参数format的地址传给argPtr
    va_start(argPtr,format);
        
    
const   int  size  =  strlen(format) + 1 ;
    
char   * tmp  =   new   char [size];
    memset(tmp, 
0 , size);

    
while  ( * format  !=   0 )
    {
        
int  i;
        
for  (i = 0 ; i < size  &&   * format != ' % '   &&   * format != 0 ; i ++ )
        {
            tmp[i]
=* format ++ ;
        }
        tmp[i] 
=   0 // 在有效的字符串末尾作0值防护

        printf(
" %s " ,tmp);

        
if  ( * format  ==   0 )
            
return   true ;

        
switch ( *++ format)
        {
        
// 按指定类型读取下一个参数,并打印
         case   ' d ' : { printf( " %d " , va_arg(argPtr,  int ));  break ;}
        
case   ' s ' : { printf( " %s " , va_arg(argPtr,  char   * ));  break ; }
        
case   ' c ' : { printf( " %c " , va_arg(argPtr,  char ));  break ;}
        
case   ' f ' : { printf( " %f " , va_arg(argPtr,  float ));  break ;}
        
        
// 对%%的处理
         case   ' % ' : { printf( " %% " );  break ; }

        
// 格式错误
         default  : { printf( " Error Ocurr!Please Check the Format! " );  return   false ;}
        }

        
++ format;

    }
    
    delete[] tmp;
    
return   true ;
}

int  main( int  argc, char   *  argv[])
{

    zykPrintf(
" %zyk " );  // error
    zykPrintf( " zyk% " );  // error

    zykPrintf(
" %%zyk%%zyk%% " );  // OUTPUT: %zyk%zyk%
    zykPrintf( "/n zyk is a pretty boy! His age is %d and %s " , 5 , " I love zyk^_^! " );

                     getch();
                     
return   0 ;
}

有更好的方法,请贴上来。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值