宁静的天空

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  5 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
对于有些函数,我们没有办法确定其在各个调用中的具体参数个数和类型,声明这种函数的方法就是在函数参数序列结尾增加“...”;例如C语言中的控制台输出函数:int __cdecl printf (const char*, ...);
一,对标准C语言中输出函数的介绍;
该函数是C语言中比较重要的一个函数,几乎每一个控制台程序中都会出现该函数,向控制台输出数据。该函数的运行步骤如下:
1。通过各种C函数获取需要向控制台输出的字符串;
2。向控制台输出需要输出的字符串;
对于第一步,具体实现如下: 
char TheString[N];      //其中N-1为输出的最大字符数
va_list ap;
va_start(ap,FirstStr);
vsprintf(TheString,FirstStr,ap);        //其中FirstStr,为函数sprintf的第一个参数,格式化处理的字符串
va_end(ap);
经过以上语句,则把printf想输出的字符串整理到数组TheString里;
对于第二步,一般和操作系统有关系,应该调用操作系统API直接向控制台输出数据即可;
二,对函数vsprintf的介绍
在介绍一中,对printf函数的参数处理中,使用了函数vsprintf,该函数把printf函数的多参数格式化为一个需要输出的字符串;该函数的第二个参数为格式化的字符串格式,如:“now output is %d”;该字符串的最后有一个格式串%d,该格式串的意思为下一个参数为int型,并把该整形变量格式为字符串输出;具体实现如下:
vsprintf(char *OutString,const char *fmtStr,va_list ap)
{
string TempStr(fmtStr),OutStr;
string::size_type idx;
idx = TempStr.find('%');
OutStr.clean();
while(idx != string::npos)
{
OutStr += TempStr.substr(0,idx);
TempStr.erase(0,idx);
switch(TempStr[1])
{
case 'd':
int num = va_arg(ap,int);
//把num按照格式输入到OutStr
。。。
TempStr.erase(0,2);
break;
case 'f':
//按照同样方法处理,float型变量;
}
}
strcpy(OutString,OutStr.c_str());
return 0;
}
在以上函数中,使用了C标准函数va_arg,该函数对函数的堆栈进行处理,必须谨慎使用;使用完毕后应该向在printf函数中一样使用va_end,把堆栈恢复原样;
由于时间问题,暂时不深入探讨va_arg;
posted on 2006-12-12 09:33 heying 阅读(452) 评论(0)  编辑 收藏 引用 所属分类: 技术文章

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理