电视剧》吧互爆,看今年仙侠类电视剧剧有多火

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
简单文件传送协议(TFTP)的C语言实现.pdf4页
本文档一共被下载:
次 ,您可免费全文在线阅读后下载本文档
文档加载中...广告还剩秒
需要金币:80 &&
简单文件传送协议(TFTP)的C语言实现.pdf
你可能关注的文档:
··········
··········
第12卷 第3期
Vo1.12No.3
doi:lO.39690.issn..8
简单文件传送协议
1F『TP 的C语言实现
西南交通大学信息科学与技术学院,四川 成都 610031
摘 要 :TFTP
简单文件传送协议 是TCP/TP协议族中用来在客户机与服务器之间进行简单
文件传输的协议 。文中给出了在visualC++6.0开发平台上 ,用C语言按照T P协议在服务器
跟 多客户端之 间进行文件传输的实现方法 ,该方法可 以传输超过32MB的文件 。
关键词 :TFTP;server;client;超 时重传
1 系统所要解决的问题
利用TFTP简单文件传输协议可以实现TFTP
在T丌1P文件的传输过程中,通常都要求有一
server与TFTrPclient之间的文件传输 ,包括多客
定的容错能力。大部分的错误都会导致连接 中
户的下载和上传请求。
断。假如错误由一个错误 的数据包 引起 ,则这个
如果客户端发送 的是下载请求 ,那么 ,服务
包将不被确认 ,也不会被重新发送 ,因此 ,另一
器将根据客户端发过来的报文 。解析出文件的路
方将无法接收到 。如果错误包丢失 ,则将使用超
径和文件名 。并且根据解析 出来 的文件名 ,开始
时机制 。一般的错误主要是 由三种情况引起 :一
读文件并构造报文。然后再经过获取客户端发过
是不能满足请求 ;二是收到 的数据包 内容错误 ,
来 的端 口号,把DATA报文发送给客户端
正在加载中,请稍后...TFTP 文件传输,简单功能实现,c语言 vc 6.0 编译通过 WinSock-NDIS 网络编程 238万源代码下载-
&文件名称: TFTP
& & & & &&]
&&所属分类:
&&开发工具: Visual C++
&&文件大小: 5 KB
&&上传时间:
&&下载次数: 14
&&提 供 者:
&详细说明:tftp 文件传输,简单功能实现,c语言实现,vc 6.0 编译通过-tftp file transfer, simple functions, c language, vc 6.0 compiler through
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&简易TFTP文件传送C语言实现\server.c&&.........................\client.c&&简易TFTP文件传送C语言实现
&近期下载过的用户:
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - p2p 技术 使用与文件的传输 有客户端和服务器的编程 VC++ 能够实现基本的文件传输 下载工作
&[] - 使用IP网络提供的UDP传输协议,实现一个简单实现一个简单的文件传送软件TFTP
&[] - linux TFTP源代码
&[] - VC6实现TFTP程序-包含服务器客户端源码-C语言
&[] - 基于linux c udp网络编程实现的客户端 TFTP文件上传/下载,可以与官方的tftp服务器实现良好传输
&[] - c++实现TFTP协议 实现多种功能,重传、读请求、写请求
&[] - VC6.0实现的TFTP程序
包含服务器客户端源码
&[] - Console TFTP client(including source code) on MS windows《C++语言编程规范学习笔记》
《C++语言编程规范学习笔记》
1. 使用const常量取代宏
2. 一组相关的整型常量应定义为枚举
3. 不相关的常量,即使取值一样,也必须分别定义
4. 尽可能使用const
1. 禁止用memcpy、memset初始化非POD对象
2. 变量使用时才声明并初始化
3. 避免构造函数做复杂的初始化,可以使用“init”函数
4. 初始化列表要严格按照成员声明顺序来初始化它们
5. 明确有外部依赖关系的全局与静态对象的初始化顺序
类型转换:
1. 使用C++风格的类型转换,不要使用C风格的类型转换
2. 避免使用reinterpret_cast
3. 避免使用const_cast
4. 避免使用const_cast
5. 使用虚函数替换dynamic_cast
1. 内联函数(inline
function)小于10行
2. 使用内联函数代替函数宏
3. 内联函数应该放在头文件中声明,而且在函数前添加inline关键字
4. 内联函数的实现放在独立的文件
5. 入参尽量用const引用取代指针
6. 消除未使用函数参数
7. 尽量少用缺省参数
8. 尽量少用函数指针
1. 类职责单一
2. 隐藏信息
3. 尽量使类的接口正交、少而完备
4. 模块间对外接口类不要暴露私有和保护成员
5. 避免成员函数返回成员可写的引用或者指针
6. 禁止类之间循环依赖
7. 将数据成员设为私有的(struct除外),并提供相关存取函数
8. 使用PIMPL模式,确保私有成员真正不可见
构造、赋值和析构:
1. 包含成员变量的类,须定义构造函数或者默认构造函数
2. 为避免隐式转换,将单参数构造函数声明为explicit
3. 包含资源管理的类应自定义拷贝构造函数、赋值操作符和析构函数
4. 让operator=返回*this的引用
5. 在operator=中检查给自己赋值的情况
6. 在拷贝构造函数、赋值操作符中对所有数据成员赋值
7. 通过基类指针来执行删除操作时,基类的析构函数设为公有且虚拟的
8. 避免在构造函数和析构函数中调用虚函数
9. 拷贝构造函数和赋值操作符的参数定义成const引用类型
10. 在析构函数中集中释放资源
1. 用组合代替继承
2. 避免使用多重继承
3. 使用public继承而不是protected/private继承
对继承而言,努力做到"是...一个"的关系,否则使用组合代替。
4. 继承层次不超过4层
5. 虚函数绝不使用缺省参数值
6. 绝不重新定义继承而来的非虚函数
7. 避免派生类中定义与基类同名但参数类型不同的函数
8. 派生类重定义的虚函数也要声明virtual关键字
1. 尽量不重载操作符,保持重载操作符的自然语义
2. 仅在输入参数类型不同、功能相同时重载函数
3. 使用重载以避免隐式类型转换
4. C/C++混用时,避免重载接口函数
1. 使用名字空间进行归类,避免符号冲突
2. 不要在头文件中或者#include之前使用using指示符
3. 尽量少使用嵌套类
4. 尽可能不使用局部类
5. 使用静态成员函数或名字空间内的非成员函数,避免使用全局函数
6. 避免class类型的全局变量,尽量用单件模式
1. 谨慎使用模板,只使用模板的基础特性
2. 注意使用模板的代码膨胀
3. 模板类型应该使用引用或指针
4. 模板如果有约束条件,请在模板定义处显式说明
5. 两个模块之间接口中尽量不要暴露模板
1. 不要在extern
"C"内部使用#include包含其他头文件
2. 避免使用友元
3. 避免使用RTTI
4. 使用sizeof(变量)而不是sizeof(类型)
资源分配和释放:
1. 明确产品动态内存的申请与释放原则
2. 明确operator new的行为和检查策略
3. 释放内存后,要立即将指针设置为NULL,防止产生野指针
4. 单个对象释放使用delete,数组对象释放使用delete []
5. 释放结构(类)指针时,首先释放其成员指针的内存空间
6. 释放指针数组时,首先释放数组每个元素指针的内存
7. 不要返回局部对象指针
8. 不要强制关闭线程
9. 使用new, delete的封装方式来分配与释放内存
10. 避免在不同的模块中分配和释放内存
特性来帮助追踪动态分配
1. 减少不必要的异常
2. 构造和析构函数不能抛出异常
3. 通过传值的方式抛出,通过引用的方式捕获
4. 确保抛出的异常一定能被捕捉到
5. 确保异常发生后资源不泄漏
6. 独立编译模块或子系统的外部接口禁止抛异常
错误处理策略:
1. 建立合理的错误处理策略
2. 离错误最近的地方处理错误或转换错误
3. 错误发生时,至少确保符合基本保证;对于事务处理,至少符合强保证;对于原子操作,符合无错误保证
1. 避免使用auto_ptr
2. 仅将scoped_ptr、shared_ptr和unique_ptr用于管理单个对象
3. 如果涉及循环引用,使用weak_ptr解开循环
4. 使用make_shared代替new生成shared_ptr
5. 对于同一个对象一旦使用shared_ptr,后续就要处处使用shared_ptr
6. 对于返回自身的shared_ptr指针的对象,要从enable_shared_from_this类派生
7. 不要将使用不同版本stl、boost等模板库编译的模块连接在一起
8. 不要保存string::c_str()指针
9. 不要将stl、boost等模板库中的数据类型传递到动态链接库或者其它进程中
10. 使用容器时要评估大量插入删除是否会生成大量内存碎片
11. 使用string代替char*
12. 使用stl、boost等知名模板库提供的容器,而不要自己实现容器
13. 使用新的标准库头文件
程序效率(C++语言的性能优化指导):
1. 先测量再优化,避免不成熟的优化
2. 选用合适的算法和数据结构
3. 在构造函数中用初始化代替赋值
4. 当心空的构造函数或析构函数的开销
5. 对象参数尽量传递引用(优先)或指针而不是传值
6. 尽量减少临时对象
7. 优先采用前置自增/自减
8. 简单访问方法尽量采用内联函数
9. 要审视标准库的性能规格
10. 用对象池重载动态内存管理器
11. 注意大尺寸数组的初始化效率
12. 避免在函数内部的小块内存分配
1. 多线程、进程并行访问共享资源时,一定要加锁保护
2. 锁的职责单一
3. 锁范围尽量小,只锁对应资源操作代码
4. 避免嵌套加锁;如果必须加锁,务必保证不同地方的加锁顺序是一样的
5. 进程间通讯,使用自己保证互斥的数据库系统、共享内存,或socket消息机制;尽量避免使用文件等进程无法管理的资源
6. 可重入函数尽量只使用局部变量和函数参数,少用全局变量、静态变量
引申:一些库函数也是非线程安全,调用时可能会出现多线程并发访问问题。
7. 锁中避免调用函数;如果必须调用函数,务必保证不会造成死锁
其次,锁中调用函数,也会把对资源操作的代码扩大化,不利于并行效率。更主要的是,这种操作,由于加锁的范围变大,引起死锁的可能就增大。
8. 锁中避免使用跳转语句
1. 类命名以大写字母开头,中间单词也以大写开头
2. 类的声明按照一定的次序进行,关键字不缩进
3. 构造函数初始化列表在同一行或按4格缩进并排几行
4. 使用‘//’注释方式,而不是‘'
5. 为重要的类或结构体作注释,注释格式支持工具自动生成
6. 为所有重要的成员函数作注释
7. 正式发布的代码不能使用TODO 注释
8. 整个项目需要的公共头文件应放在一个单独的目录下
9. 一个模块的目录层次不宜太深,以1~2层为宜,接口文件放在最外层
10. 保持文件前言的简洁性
可移植性(兼容性):
1. 不直接使用C++的基本数据类型,不要假定其存储尺寸长度
2. 避免指针截断
3. 注意数据类型对齐问题
4. 在涉及网络字节序处理时,要注意进行网络字节序与本地字节序的转换
5. 避免无符号数与有符号数的转换
6. 创建64 位常量时使用LL 或ULL 作为后缀
7. 区分sizeof(void *)和sizeof(int)
8. 编译器,操作系统相关的代码独立出来
1. 使用正确的数据类型和类处理多语言字符和字符串
2. 对字符进行处理时,需分配足够的内存空间并确保字符完整
3. 使用标准库函数判断字符属性,使应用能够支持多区域
4. 对字符串进行本地化排序、比较和查找时使用有区域参数的locale::collate&&函数
5. 处理Unicode数据时,注意检测BOM是否存在,避免产生多余字符或解码错误
单一版本:
1. 资源与程序逻辑代码分离
2. 保持资源的语义完整性,不要拼接字符串资源
3. 资源的键名中包含该资源的应用场景信息
时区夏令时:
1. 确保本地时间中时区夏令时信息完整
2. 避免使用本地时间直接进行时间计算
业界编程规范和书籍:
1. 《google C++ code style》 (google C++编程指南)
2. 《C++编程规范101条规则、准则与最佳实践》
3. &Microsoft All-In-One Code
Framework《微软一站式示例代码库》
C++ primer
5. &effective C++ / more effective
Effective STL
inside the C++ object model
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。博客访问: 882807
博文数量: 235
博客积分: 3997
博客等级: 少校
技术积分: 2239
注册时间:
Never save something for a special occasion. Every day in your life is a special occasion.
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
Borland C++ 语法摘要
常用抽象数据类型:包括TList(链表)类、AnsiString类、Set(集合)类、DynamicArray(动态数组)类和 TStream(流)类。
TList类实现了线性链表,可以存储任意类的对象。虽然它是链表,但是它实际上是一个存放指针的数组,可以通过其 Items 属性象访问一个数组那样实现对 List对象的每一个元素的访问。
主要属性:Capacity 容量Count&&& 长度需要注意的是 Count 属性并不一定是 TList 对象中元素的个数,它也包含 Items 数组中的空指针的数目。如果要删除数组中的空指针,可以使用 List的Pack方法。
Items&& 通过此属性可以象数组那样访问链表中的元素。 List&&& 获取直接进入列表中元素数组的指针。
主要方法:
int __fastcall Add(void * Item);需要注意的是,不管Items数组中有没有NULL元素,Add方法都只是在数组的末尾添加元素。
virtual void __fastcall Clear(void); 清除链表中的所有元素。释放内存,并将Capacity清0.
void __fastcall Delete(int Index); 提示:不会释放内存,也不会修改Capacity。
void __fastcall Exchange(int Index1, int Index2); 交换两个元素的位置。
TList* __fastcall Expand(void); 需要时(Count=Capacity)扩容到2的X次方倍。
int __fastcall IndexOf(void * Item);查找元素。
void __fastcall Insert(int Index, void * Item);& 插入元素 到指定位置。
void __fastcall Move(int CurIndex, int NewIndex); 移动元素 到指定位置。
void __fastcall Pack(void); 删除Items列表中所有指针值为NULL的元素。 此操作并不释放内存, 即只会改变Count。
int __fastcall Remove(void * Item); 删除指定值的元素。返回元素先前的位置。
Add方法和Remove方法的参数都是列表的元素对象。
TList *pList = new TList();
AnsiString TheObject = "This is an object."
pList->Add(TheObject);
MessageDlg("列表中有 " + IntToStr(pList->Count) + "个元素",
&&&&mtInformation, TMsgDlgButtons() << mbOK, 0);
pList->Remove(TheObject);
delete pList;
pList=NULL;
typedef int __fastcall (*TListSortCompare)(void * Item1, void * Item2); void __fastcall Sort(TListSortCompare Compare); 通过自定义的比较函数Compare来对列表中的元素进行排序。 示例:
int __fastcall CompareNames(void *Item1, void *Item2)
&&&&&return CompareText(((TComponent*)Item1)->Name, ((TComponent *)Item2)->Name);
void __fastcall TForm1::Button1Click(TObject *Sender)
&&&&List1->Sort(CompareText);
}2.1.2 AnsiString 类 AnsiString是C++Builder中仿照Object Pascal语言中的长字符串类型设计的一个字符串类 siString类型。本质上,AnsiString 仍然以’\0’作为字符串的结尾标志,只是在字符串的前面添加了几个字节的信息头。 比较C++中提供的串类型,AnsiString 提供了更多实用、方便的方法。
赋值:=连接:+、+=比较:<、、>=、!=字符索引:[] (注:串中字符索引从1开始)
char* __fastcall c_str()& 返回一个C/C++标准字符串指针。
AnsiString& __fastcall Delete(int index, int count);删除index开始的count个字符。提示:count可以超过剩余长度,则删除所有剩余。
static AnsiString __fastcall FormatFloat(const AnsiString& format,const long double& value); 将value用format指定的格式转换为字符串形式。
示例:Format string&& 1234&&&&& -1234&&&&& 0.5&&&&&&& 0&& #,##0.00&&&&&&& 1,234.00& -1,234.00& 0.50&&&&&& 0.000.000E+00&&&&&& 1.234E+03 -1.234E+03 5.000E-01& 0.000E+00
提示:# 表示此位置可空缺。0 表示此位置以0填充。
AnsiString& __fastcall Insert(const AnsiString& str, int index); 插入。
static AnsiString __fastcall IntToHex(int value, int digits); Hex格式的串。
bool __fastcall IsEmpty()判断空串。
int __fastcall Length() 长度。
static AnsiString __fastcall LoadStr(HINSTANCE hInstance, int ident); static AnsiString __fastcall LoadStr(int ident); 从指定句柄中读取标志为ident的字符资源。如果没有指定句柄,则从当前模块(如可执行程序)中读取。
AnsiString __fastcall LowerCase() AnsiString __fastcall UpperCase() 大小写转换。
int __fastcall Pos(const AnsiString& subStr) 定位子串。注意:无子串时返回0(因为 bc++串中字符索引从1开始).
AnsiString& __fastcall SetLength(int newLength); 修改串的Length属性。
static AnsiString __fastcall StringOfChar(char ch, int count); 字符重复成串。
AnsiString __fastcall SubString(int index, int count)& 截取子串。
double __fastcall ToDouble()int __fastcall ToInt() int __fastcall ToIntDef(int defaultValue) ToInt 和 ToIntDef 方法都是将字符串转换为一个整型数,不同之处在于如果字符串没有可用的字符,前者会抛出一个异常,后者则会返回默认值defaultValue。
AnsiString __fastcall TrimLeft() AnsiString __fastcall TrimRight()AnsiString __fastcall Trim()截去首尾空格。
2.1.3 Set(集合)
Set是一个C++类模板,用来实现集合这个抽象数据类型。&& 此模板使用时有三个参数,其中type用来指定集合元素的类型(如int、char、枚举变量等) ;minval为集合元素的最小值,minval不能小于0;maxval为集合元素的最大值,它不能大于255。
对集合变量的声明并不会对它的值初始化,可以在声明变量之后使用<<操作符赋值,如下:
Set <char, 'A', 'C'> s1; // 直接定义集体对象
s1 << 'A' << 'B' << 'C'; //初始化
typedef Set <char, 'A','Z'> UPPERCASESet; // 使用typedef
UPPERCASESet s2;
s2 << 'A' << 'B' << 'C';
Set常用方法:
Set& __fastcall Clear(); 清空集合。
bool __fastcall Contains(const T el) 查询集合对象中是否含有指定的元素el。
bool __fastcall Empty()判断空集。
比较:==、!=判断集合是否相等。注意:只有类型和包含元素都相等的两个集体才相等。前面的例子中 s1!=s2, 虽然它们含有相同的元素。
operator +/*/- 分别为集合之间的并集、交集、并集中交集的补集运算的运算符。 // 并、交、差集?
operator <> 添加或删除元素。
集合示例:如判断键盘事件和鼠标事件时,需要处理的Shift参数就是一个集合类型typedef SetTShiftState。
2.1.4 DynamicArray(动态数组)DynamicArray ArrayN 这是一个模板类,它的元素可以为任意类型。
大小 Length。索引 []。
比较和赋值:赋值要使用 Copy/CopyRange 方法。注意:不要在动态数据上使用 ==、=,那操作的对象是指针!
多维动态数组,如
typedef DynamicArray< DynamicArray < AnsiString > > T2DStringArray;
T2DStringArray d2a;
d2a.Length = 3;
for(int i=0; i<d2a.Length; i++)
&d2a[i].Length = 4;
2.1.5 TStream(流)流类用于进行各种存储媒介之间的数据操作。TStream 类的几种派生类分别实现与某种特殊的存储媒介之间的数据交换,如磁盘数据、内存数据等。除了数据的读取、写入和复制之外, 在TStream类实例中还可以用Seek到流中的任意位置。
TStream 是一个抽象类,其派生类有 TFileStream、TStringStream、TMemoryStream等。
属性:Position 流文件当前指针的位置。以字节为单位。Size&&&& 流文件大小。以字节为单位。
方法:__int64 __fastcall CopyFrom(TStream* Source, __int64 Count);
__int64 __fastcall CopyFrom(TStream* Source, __int64 Count);& 从Source流文件中读取Count字节的内容到当前流文件中,函数返回值为实际拷贝的字节数。
示例:将指定文件复制到工程所在目录。
void __fastcall TForm1::Button1Click(TObject *Sender)
&AnsiString NewFileName = ExtractFilePath(Application->ExeName)
&&&&+ ExtractFileName(Edit1->Text);
&AnsiString msg = Format("Copy %s to %s", ARRAYOFCONST((Edit1->Text, NewFileName)));
&if(MessageDlg(msg, mtInformation, mbOKCancel, 0) == mrOk)
&&TFileStream *OldFile = new TFileStream(Edit1->Text, fmOpenRead);
&&&TFileStream *NewFile = new TFileStream(NewFileName, fmCreate);
&&&&NewFile->CopyFrom(OldFile, OldFile->Size);
&&&__finally
&&&&FreeAndNil(NewFile);
&&__finally
&&&FreeAndNil(OldFile);
virtual int __fastcall Read(void *Buffer, int Count) = 0; & 此方法用于从当前流文件的当前指针所在位置开始,读取Count字节的内容到Buffer内存位置,返回值为实际读取的字节数。如果返回值小于 Count,则意味着还没有读够 Count个字节的内容,指针位置已经到了流文件的末尾。其它的数据读取的方法,如ReadBuffer和ReadComponent,都是通过对Read方法的调用来实现的。
virtual int __fastcall Seek ffset, (int O Word Origin); virtual __int64 __fastcall Seek(const __int64 Offset, TSeekOrigin Origin); 读取流。返回值为流文件中新的当前位置(Position 属性)。Origin 参数的取值可以为 soFromBeginning(流文件的开始位置) 、soFromCurrent (流文件的当前位置)或soFromEnd(流文件的结尾位置) 。 &virtual int& fastcall Write(const void *Buffer, int Count) = 0; 写入流。返回值为写入的字节数。所有其它的数据写入方法,如 WriteBuffer 和WriteComponent都是靠调用Write来实现的。
TMemoryStream 是 TStream 的派生类,它有两个比较重要的方法,SaveToStream 和LoadFromStream,下面是它们的一个示例:
void __fastcall TForm1::Button1Click(TObject *Sender)
&TMemoryStream* pms = new TMemoryStream();
&//将列表框的内容写入流文件
&ListBox1->Items->SaveToStream(pms);
&//重置流文件的当前位置到文件的开头
&pms->Position = 0;
&//将流文件的内容写入RichEdit组件
&RichEdit1->Lines->LoadFromStream(pms);.
&delete pms;
2.2.1 系统函数
extern PACKAGE Extended __fastcall RandG(Extended Mean, Extended StdDev); 产生服从高斯分布的随机数
extern PACKAGE double __fastcall RandomFrom(const double *AValues, int AValues_Size); extern PACKAGE int __fastcall RandomFrom(const int *AValues, int AValues_Size); extern PACKAGE __int64 __fastcall RandomFrom(const __int64 *AValues, int AValues_Size);RandomFrom 函数用于从一个数组中随即取得其元素.
extern PACKAGE int RandS 随机数种子.
extern PACKAGE void __fastcall Randomize(void);初始化随机数产生器.
extern PACKAGE int __fastcall RandomRange(cost int AFrom, const int ATo);& 此函数返回一个从 AFrom 到 ATo(包含此值)的整数,如果 AFrom 大于 ATo,可以返回负数。
void gettime(struct time *timep);void settime(struct time *timep); 获取/设置系统时间。&其中time结构struct time { unsigned char ti_&/* minutes */unsigned char ti_&/* hours */ unsigned char ti_&/* hundredths of seconds */ unsigned char ti_&/* seconds */};
clock_t clock(void);&&& typedef long clock_t;
示例:计算程序中某段代码的执行时间
#include <time.h>
#include <stdio.h>
#include <dos.h>
int main(void)
&&&clock_t start, end;
&&&start = clock();
&&&delay(2000);
&&&end = clock();
&&&&&&printf("The time was: %f\n", (end - start) / CLK_TCK);
&&&return 0;
内联函数对于频繁调用的简短函数,为了省去函数调用和返回的时间,在函数之前添加Inline声明它为内联。
inline char * X::func(void){}&& 此函数是定义类X中的成员函数func为Inline函数。
如果在类的定义中直接编写函数代码,则跟在函数前添加Inline标志的作用相同。
2.2.3 参数个数不定的函数 可以使用va_arg、va_end、 和va_start三个宏来处理不定长的函数参数列表,它们定义在 stdarg.h 中。
void va_start(va_list ap, lastfix); type va_arg(va_list ap, type);void va_end(va_list ap);
&示例:求所有入口参数的代数和
#include <stdio.h>
#include <stdarg.h>
/* calculate sum of a 0 terminated list */
void sum(char *msg, ...)
&&&int total = 0;
&&&a_list ap;
&&&int arg;
&&&va_start(ap, msg);
&&&while((arg=va_arg(ap, int))!= 0)
&&&&&&&&total += arg;
&&&// MessageDlg(AnsiString("sum is ")+total, mtInformation, TMsgDlgButtons()<<mbOK, 0);
void main()
&sum("The total of 1+2+3 is %d\n", 1,2,3,0);
阅读(3232) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 仙侠剑电视剧全集 的文章

 

随机推荐