strcpy

news/2024/6/29 11:49:58 标签: null, 编译器, string, 语言, c
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">

http://baike.baidu.com/view/1026861.htm

 

 strcpy函数功能

 

class="headline-content">出现频率最高的笔试题strcpy写法

class="headline-2 bk-sidecatalog-title">class="headline-content">题目:

  已知strcpy函数的原型是:

  char * strcpy(char * strDest,const char * strSrc);

  1.不调用库函数࿰c;实现strcpy函数。

  2.解释为什么要返回char *。

class="headline-2 bk-sidecatalog-title">class="headline-content">解说:

  1.strcpy的实现代码

  char * strcpy(char * strDest,const char * strSrc)

  {

  char * strDestCopy=strDest; //[3]

  if ((strDest==NULL)||(strSrc==NULL)) //[1]

  throw "Invalid argument(s)"; //[2]

  while ((*strDest++=*strSrc++)!='/0'); //[4]

  return strDestCopy;

  }

  错误的做法:

  [1]

  (A)不检查指针的有效性࿰c;说明答题者不注重代码的健壮性。

  (B)检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc))࿰c;说明答题者对Cclass="tags" href="/tags/YuYan.html" title=语言>语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换࿰c;这种功能虽然灵活࿰c;但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false三个关键字以提供更安全的条件表达式。

  (C)检查指针的有效性时使用((strDest==0)||(strSrc==0))࿰c;说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单࿰c;但程序中可能出现很多处对指针的检查࿰c;万一出现笔误࿰c;color: #136ec2;">class="tags" href="/tags/BianYiQi.html" title=编译器>编译器不能发现࿰c;生成的程序内含逻辑错误࿰c;很难排除。而使用NULL代替0࿰c;如果出现拼写错误࿰c;class="tags" href="/tags/BianYiQi.html" title=编译器>编译器就会检查出来。

  [2]

  (A)return new class="tags" href="/tags/STRING.html" title=string>string("Invalid argument(s)");࿰c;说明答题者根本不知道返回值的用途࿰c;并且他对内存泄漏也没有警惕心。从函数中返回函数体内分配的内存是十分危险的做法࿰c;他把释放内存的义务抛给不知情的调用者࿰c;绝大多数情况下࿰c;调用者不会释放内存࿰c;这导致内存泄漏。

  (B)return 0;࿰c;说明答题者没有掌握异常机制。调用者有可能忘记检查返回值࿰c;调用者还可能无法检查返回值(见后面的链式表达式)。妄想让返回值肩负返回正确值和异常值的双重功能࿰c;其结果往往是两种功能都失效。应该以抛出异常来代替返回值࿰c;这样可以减轻调用者的负担、使错误不会被忽略、增强程序的可维护性。

  [3]

  (A)忘记保存原始的strDest值࿰c;说明答题者逻辑思维不严密。

  [4]

  (A)循环写成while (*strDest++=*strSrc++);࿰c;同[1](B)。

  (B)循环写成while (*strSrc!='/0') *strDest++=*strSrc++;࿰c;说明答题者对边界条件的检查不力。循环体结束后࿰c;strDest字符串的末尾没有正确地加上'/0'。

  2.返回strDest的原始值使函数能够支持链式表达式࿰c;增加了函数的“附加值”。同样功能的函数࿰c;如果能合理地提高的可用性࿰c;自然就更加理想。

  链式表达式的形式如:

  int iLength=strlen(strcpy(strA,strB));

  又如:

  char * strA=strcpy(new char[10],strB);

  返回strSrc的原始值是错误的。其一࿰c;源字符串肯定是已知的࿰c;返回它没有意义。其二࿰c;不能支持形如第二例的表达式。其三࿰c;为了保护源字符串࿰c;形参用const限定strSrc所指的内容࿰c;把const char *作为char *返回࿰c;类型不符࿰c;编译报错。

  在上面的语句中࿰c;循环语句while ((*strDest++=*strSrc++)!='/0');较难理解࿰c;可以把这句理解为以下操作。

  第一种:

  while(1)

  {

  char temp;

  temp=*strDest=*strSrc;

  strDest++;

  strSrc++;

  if('/0'==temp)

  break;

  }

  第二种:

  while(*strSrc!='/0')

  {

  *strDest=*strSrc;

  strDest++;

  strSrc++;

  }

  *strDest=*strSrc;

  个人意见:throw用法明显的运行不通࿰c;如果要判断加#include<assert.h>

  如果表达式的值为假࿰c;整个程序将退出࿰c;并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。

  使用这个宏前需要包含头文件assert.h

  #include <assert.h>

  #include<iostream.h> 

  char * strcpy(char * strDest ,const char *strSrc)

  {

  assert((strDest!=NULL) && (strSrc !=NULL));

  char * strDestCopy=strDest;

  while ((*strDest++=*strSrc++)!='/0');

  return strDestCopy;

  }

  void main()

  {

  char a[20], c[]="i am teacher!";

  strcpy(a,c);

  cout<<a<<endl;

  }

 

 

http://blog.csdn.net/shanchailee/archive/2009/05/26/4218907.aspx

 

 

cle>

http://www.niftyadmin.cn/n/790345.html

相关文章

来点实用的Java NIO(一)

[b][colorolive][sizex-large]Java 7对原有的NIO进行了重大改进&#xff0c;这个改进主要包括2个方面&#xff1a; 第一&#xff0c;提供了全面的文件IO和文件系统访问支持。 第二&#xff0c;基于异步Channel的IO IO流的操作在Java中属于一项高级的技能&#xff0c;因为这个知…

redis实现消息队列(发布/订阅模式)

redis的列表类型天生支持用作消息队列(类似于MQ的队列模型–任何时候都可以消费&#xff0c;一条消息只能消费一次)&#xff0c;学习过程借鉴https://www.cnblogs.com/qlqwjy/p/9763754.html 关于redis的list操作https://blog.csdn.net/weixin_43113679/article/details/900809…

Lucene4.3进阶开发之初入仙界(一)

[b][colorred][sizex-large]转载请务必注明&#xff0c;原创地址&#xff0c;谢谢配合! [url]http://qindongliang1922.iteye.com/blog/1980262[/url] [/size][/color][/b] [b][colorolive][sizelarge]Lucene在最近的几个月里已经频繁更新了好几个版本了&#xff0c;越是更新的…

一步一步写算法(之排序二叉树删除-1)

一步一步写算法&#xff08;之排序二叉树删除-1&#xff09; 原文:一步一步写算法&#xff08;之排序二叉树删除-1&#xff09; 【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 相比较节点的添加…

C++程序员们,快来写最简洁的单例模式吧

想必每一位程序员都对设计模式中的单例模式非常的熟悉吧&#xff0c;以往我们用C实现一个单例模式需要写以下代码&#xff1a; 1 class CSingleton2 {3 private:4 CSingleton() //构造函数是私有的5 {6 }7 static CSingleton *m_pInstance;8 public:9 stat…

来点实用的Java NIO(二)

[b][colorgreen][sizex-large]现在如下一个简单的需求&#xff1a;要你用程序要遍历指定目录下的所有文件和子目录&#xff0c;你会怎么做&#xff1f; 估计大部分人&#xff0c;依旧使用的是老方式&#xff0c;采用递归的方式&#xff0c;来进行遍历&#xff0c;这种方式不仅复…

Redis实现聊天功能

不光redis能实现来聊天的功能&#xff0c;很多数据库都能实现&#xff0c;也不是说非得key-value类型的数据库&#xff0c;关系型数据库也可以&#xff0c;用心跳机制(多少时间访问数据库来维持数据的最新) 转载自https://www.cnblogs.com/qlqwjy/p/9784956.html 1&#xff0c;…

来点实用的Java NIO(三)

[b][colorgreen][sizelarge]继昨天的NIO文件夹遍历&#xff0c;散仙今天要分享另外两个基于NIO的比较实用的知识&#xff0c;第一个分享的是使用NIO对操作系统的文件进行监控&#xff0c;第二个要分享的是关于操作系统的文件锁&#xff0c;&#xff08;散仙:这个会放在下一篇博…