




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
上面是一个基本实现。1.va_start() va_end()函数应用(/article/2007-5-31/1838-1.htm)1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表void foo(.);void foo(parm_list,.);2:函数参数的传递原理函数参数是以数据结构:栈的形式存取,从右至左入栈.eg:#include void fun(int a, .)int *temp = &a;temp+;for (int i = 0; i a; +i)cout *temp endl;temp+;int main()int a = 1;int b = 2;int c = 3;int d = 4;fun(4, a, b, c, d);system(pause);return 0;Output:12343:获取省略号指定的参数在函数体中声明一个va_list,然后用va_start函数来获取参数列表中的参数,使用完毕后调用va_end()结束。像这段代码:void TestFun(char* pszDest, int DestLen, const char* pszFormat, .)va_list args;va_start(args, pszFormat);_vsnprintf(pszDest, DestLen, pszFormat, args);va_end(args);4.va_start使argp指向第一个可选参数。va_arg返回参数列表中的当前参数并使argp指向参数列表中的下一个参数。va_end把argp指针清为NULL。函数体内可以多次遍历这些参数,但是都必须以va_start开始,并以va_end结尾。1).演示如何使用参数个数可变的函数,采用ANSI标准形式#include stdio.h#include string.h#include stdarg.h/*函数原型声明,至少需要一个确定的参数,注意括号内的省略号*/int demo( char, . );void main( void ) demo(DEMO, This, is, a, demo!, );/*ANSI标准形式的声明方式,括号内的省略号表示可选参数*/int demo( char msg, . ) /*定义保存函数参数的结构*/ va_list argp; int argno = 0; char para; /*argp指向传入的第一个可选参数,msg是最后一个确定的参数*/ va_start( argp, msg ); while (1) para = va_arg( argp, char); if ( strcmp( para, ) = 0 ) break; printf(Parameter #%d is: %sn, argno, para); argno+; va_end( argp ); /*将argp置为NULL*/return 0;2)/示例代码1:可变参数函数的使用#include stdio.h#include stdarg.hvoid simple_va_fun(int start, .) va_list arg_ptr; int nArgValue =start; int nArgCout=0; /可变参数的数目 va_start(arg_ptr,start); /以固定参数的地址为起点确定变参的内存起始地址。 do +nArgCout; printf(the %d th arg: %dn,nArgCout,nArgValue); /输出各参数的值 nArgValue = va_arg(arg_ptr,int); /得到下一个可变参数的值 while(nArgValue != -1); return;int main(int argc, char* argv) simple_va_fun(100,-1); simple_va_fun(100,200,-1); return 0;3)/示例代码2:扩展自己实现简单的可变参数的函数。下面是一个简单的printf函数的实现,参考了中的例子#include stdio.h#include stdlib.hvoid myprintf(char* fmt, .) /一个简单的类似于printf的实现,/参数必须都是int 类型 char* pArg=NULL; /等价于原来的va_list char c; pArg = (char*) &fmt; /注意不要写成p = fmt !因为这里要对/参数取址,而不是取值 pArg += sizeof(fmt); /等价于原来的va_start do c =*fmt; if (c != %) putchar(c); /照原样输出字符 else /按格式字符输出数据 switch(*+fmt) cased: printf(%d,*(int*)pArg); break; casex: printf(%#x,*(int*)pArg); break; default: break; pArg += sizeof(int); /等价于原来的va_arg +fmt; while (*fmt != 0); pArg = NULL; /等价于va_end return;int main(int argc, char* argv) int i = 1234; int j = 5678; myprintf(the first test:i=%dn,i,j); myprintf(the secend test:i=%d; %x;j=%d;n,i,0xabcd,j); system(pause); return 0;2.vsprintf, vswprintf与printf与函数的可变参数编程 (/9527/archive/2008/05/19/2457816.aspx)在C语言编程中,我们不可避免的要接触到可变参数函数,对于不支持函数多态的C语言来讲,使用可变参数和宏定义函数是变通的实现函数多态的好方法。在进一步涉及到可变参数函数之前,我们先来看看常用到的两个可变参数的典型,分别是vsprintf和sprintf。一、vsprintf函数Header Filestdio.hCategoryMemory and String Manipulation RoutinesPrototypeint vsprintf(char *buffer, const char *format, va_list arglist);int vswprintf(wchar_t *buffer, const wchar_t *format, va_list arglist);DescriptionWrites formatted output to a string.The v.printf functions are known as alternate entry points for the .printf functions. They behave exactly like their .printf counterparts, but they accept a pointer to a list of arguments instead of an argument list.vsprintf accepts a pointer to a series of arguments, applies to each a format specifier contained in the format string pointed to by format, and outputs the formatted data to a string. There must be the same number of format specifiers as arguments.Return Valuevsprintf returns the number of bytes output. In the event of error, vsprintf returns EOF.-对照翻译头文件stdio.h分类内存和字符串操作函数原型int vsprintf(char *buffer, const char *format, va_list arglist);int vswprintf(wchar_t *buffer, const wchar_t *format, va_list arglist);描述写格式化后的输出到一个字符串v.printf函数族是.print函数族的可替代函数,他们像.printf函数族一样操作,但是他们接受指向参数列表的指针而不是参数列表。vsprintf接受一个指向一系列可变参数的指针,提供给每一个参数一个包含在form中的格式化定义,并且输出格式化后的数据到一个字符串中,格式定义和参数数量必须相等。返回值vsprintf返回输出的字节数目,出错时返回EOF二、sprintf函数Header Filestdio.hCategoryMemory and String Manipulation RoutinesPrototypeint sprintf(char *buffer, const char *format, argument, .);int swprintf(wchar_t *buffer, const wchar_t *format, argument, .);DescriptionWrites formatted output to a string.Note:For details on format specifiers, see printf.sprintf accepts a series of arguments, applies to each a format specifier contained in the format string pointed to by format, and outputs the formatted data to a string.sprintf applies the first format specifier to the first argument, the second to the second, and so on. There must be the same number of format specifiers as arguments.Return ValueOn success, sprintf returns the number of bytes output. The return value does not include the terminating null byte in the count.On error, sprintf returns EOF.-对照翻译头文件:stdio.h头文件stdio.h分类内存和字符串操作函数原型int sprintf(char *buffer, const char *format, argument, .);int swprintf(wchar_t *buffer, const wchar_t *format, argument, .);描述写格式化后的输出到一个字符串注意:对于格式化定义规范,参看printfsprintf接受一系列参数,提供给每一个参数一个格式化定义,并且输出格式化数据到字符串sprintf提供给首个参数第一个格式化定义,第二个赋予次个格式化定义,格式化定义数量必须和参数数量一致返回值成功,返回输出的字节数量,返回值不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年执业兽医试题及参考答案详解(巩固)
- 2024计算机二级通关题库附答案详解AB卷
- 2025三种人考试自我提分评估【学生专用】附答案详解
- 2025年度城市综合体灌注桩施工劳务分包合同
- 2025空气质量责任保障房屋租赁合同
- 2024年银行岗位高分题库(巩固)附答案详解
- 2025-2026学年导游资格考试练习题及答案详解(新)
- 2025年全国“安全生产月”《安全知识》竞赛题库(带答案)
- 2024-2025学年法律硕士预测复习附参考答案详解(轻巧夺冠)
- 2025年登高架设高处作业(复审)模拟考试题库试卷(含答案)
- 2024版2025秋贵州黔教版综合实践活动五年级上册全册教案教学设计
- 转作风重实干课件
- 村干部饮水安全培训总结课件
- 安全生产治本攻坚三年行动半年工作总结
- 单招备考科学方案
- 医美咨询培训课件
- 海船船员适任 评估规范(2024)轮机专业
- DB50-T 1463.2-2023 牛羊布鲁氏菌病防控技术规范 第2部分:人员防护
- NoSQL数据库应用与实践 课件 第1-6章 认识NoSQL - 增删改查
- 20世纪宋史研究:主要趋势、热点领域与未来展望
- 2025年度餐饮店知识产权保护与合伙人合同
评论
0/150
提交评论