我也来写一个类printf函数(一道深信服的笔试题)
来源:互联网 发布:合肥数据恢复中心 编辑:程序博客网 时间:2024/04/28 10:25
记起上次深信服的一道考题,叫我们实现一个与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("/nzyk is a pretty boy! His age is %d and %s",5,"I love zyk^_^!");
getch();
return 0;
}
#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("/nzyk is a pretty boy! His age is %d and %s",5,"I love zyk^_^!");
getch();
return 0;
}
有更好的方法,请贴上来。
- 我也来写一个类printf函数(一道深信服的笔试题)
- 深信服的笔试题
- 深信服笔试题
- 深信服笔试题
- 深信服笔试题
- 深信服笔试题
- 深信服笔试题(网络工程师售后)
- 深信服笔试题(转载)
- 深信服笔试题1
- C++虚函数探讨 深信服笔试题
- 我的深信服三年
- 一道很有趣的关于printf的笔试题
- 对数组名取地址(深信服笔试题)
- (深信服笔试题)简单文本文件的过滤高频率单词C++代码
- 深信服的笔试和面试
- 说说今天深信服的笔试吧
- 深信服2008校园招聘笔试题
- 深信服08年笔试题 --转
- qt-designer使用教程2--调用退出.txt
- FEC的RTP荷载格式
- 将d3d9的SDK中的src文件引入MFC工程的问题
- Google搜索指令大全
- VB程序员走向成功的终南捷径——行业人士好评章老师新书!
- 我也来写一个类printf函数(一道深信服的笔试题)
- SQL面试题与答案
- 工作总结---12月6号
- VC++与SQL数据库连接
- NBA皮鞋设计师——Ron Siegel
- VC++坐标转换
- what will I write anything today?
- 两个窗口间的通讯
- 关于VC中的控件类