



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言标准库函数原型声明:extern char *strcpy(char *dest,char *src); 头文件:string.h 功能:把src所指由NULL结束的字符串复制到dest所指的数组中。 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。 典型实现/* * C语言标准库函数strcpy的一种典型的工业级的最简实现 * 返回值: * 返回目标串的地址。 * 对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL。 * 参数: * strDeatination * 目标串 * strSource * 源串 */ char *strcpy(char *strDestination, const char *strSource) assert(strDestination & strSource); char *strD=strDestination; while (*strDestination+=*strSource+)!=0); NULL; return strD; 编辑本段出现频率最高的笔试题strcpy写法题目:已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数。 2.解释为什么要返回char *。 解说:1.strcpy的实现代码 char * strcpy(char * strDest,const char * strSrc) if (strDest=NULL)|(strSrc=NULL) /1 throw Invalid argument(s); /2 char * strDestCopy=strDest; /3 while (*strDest+=*strSrc+)!=0); /4 return strDestCopy; 错误的做法: 1 (A)不检查指针的有效性,说明答题者不注重代码的健壮性。 (B)检查指针的有效性时使用(!strDest)|(!strSrc)或(!(strDest&strSrc),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C+专门增加了bool、true、false三个关键字以提供更安全的条件表达式。 (C)检查指针的有效性时使用(strDest=0)|(strSrc=0),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序内含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。 2 (A)return new string(Invalid argument(s);,说明答题者根本不知道返回值的用途,并且他对内存泄漏也没有警惕心。从函数中返回函数体内分配的内存是十分危险的做法,他把释放内存的义务抛给不知情的调用者,绝大多数情况下,调用者不会释放内存,这导致内存泄漏。 (B)return 0;,说明答题者没有掌握异常机制。调用者有可能忘记检查返回值,调用者还可能无法检查返回值(见后面的链式表达式)。妄想让返回值肩负返回正确值和异常值的双重功能,其结果往往是两种功能都失效。应该以抛出异常来代替返回值,这样可以减轻调用者的负担、使错误不会被忽略、增强程序的可维护性。 3 (A)忘记保存原始的strDest值,说明答题者逻辑思维不严密。 4 (A)循环写成while (*strDest+=*strSrc+);,同1(B)。 (B)循环写成while (*strSrc!=0) *strDest+=*strSrc+;,说明答题者对边界条件的检查不力。循环体结束后,strDest字符串的末尾没有正确地加上0。 2.返回strDest的原始值使函数能够支持链式表达式,增加了函数的“附加值”。同样功能的函数,如果能合理地提高的可用性,自然就更加理想。 链式表达式的形式如: int iLength=strlen(strcpy(strA,strB); 又如: char * strA=strcpy(new char10,strB); 返回strSrc的原始值是错误的。其一,源字符串肯定是已知的,返回它没有意义。其二,不能支持形如第二例的表达式。其三,为了保护源字符串,形参用const限定strSrc所指的内容,把const char *作为char *返回,类型不符,编译报错。 在上面的语句中,循环语句while (*strDest+=*strSrc+)!=0);较难理解,可以把这句理解为一下操作。 第一种: while(1) char temp; temp=*strDest=*strSrc; strDest+; strSrc+; if(0=temp) break; 第二种: while(*strSrc!=0) *strDest=*strSrc; strDest+; strSrc+; *strDest=*strSrc; 个人意见:throw用法明显的运行不通,如果要判断加#include 如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。 使用这个宏前需要包含头文件assert.h #include #include char * strcpy(char * strDest ,const char *strSrc) assert(strDest!=NULL) & (strSrc !=NULL); char * strDest
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论