千家信息网

strcpy函数的实现及注意事项

发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,这篇文章主要讲解了"strcpy函数的实现及注意事项",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"strcpy函数的实现及注意事项"吧!出现频率最高的
千家信息网最后更新 2025年02月08日strcpy函数的实现及注意事项

这篇文章主要讲解了"strcpy函数的实现及注意事项",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"strcpy函数的实现及注意事项"吧!

出现频率最高的笔试题strcpy写法
题目:
  已知strcpy函数的原型是:
  char * strcpy(char * strDest,const char * strSrc);

  要求:

1.不调用库函数,实现strcpy函数。

   2.解释为什么要返回char *。
解说:
  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)不检查指针的有效性,说明答题者不注重代码的健壮性。
  (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 char[10],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 * strDestCopy=strDest;  while ((*strDest++=*strSrc++)!='\0');  return strDestCopy;  }  void main()  {  char a[20], c[]="i am teacher!";  strcpy(a,c);  cout<

总结:函数就向一个黑盒系统一样,调用它的人给他输入(调用它本身就是一种输入),然后等待一个理想中的输出或者是相应的操作。

调用者是希望我们的这个函数能够非常健壮的让他们利用,那么为了使我们的函数拥有一定的健壮性。

在每写一个函数饿开头,都要检查实参的合法性。如何合法继续,如果不合法应该主动报错。这个习惯应该在平时做练习的时候就应该保持。

当然这样下来会增加代码量。

感谢各位的阅读,以上就是"strcpy函数的实现及注意事项"的内容了,经过本文的学习后,相信大家对strcpy函数的实现及注意事项这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

函数 检查 答题者 表达式 用者 错误 程序 事项 注意事项 内存 功能 指针 循环 健壮 原始 有效 代码 内容 字符 字符串 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 密云区互联网网络技术服务系统 陕西win10电脑服务器租用 高清的垃圾分类软件开发 VB添加数据库控件绑定 宁波银行软件开发工资多少 桌面共享软件开发哪家便宜 品质软件开发服务标准 c#语言和数据库基础 网络技术应用发展前景 陕西英贸互联网科技有限公司 互联网是科技革命的产物 核心节点数据库系统重大故障是指 网络安全手抄报黑白线条 转发文章赚钱软件开发 互联网科技英语对话 sql数据库复制重命名怎么解决 上海大规模网络技术应用范围 数据库运维岗是做什么的 以网络安全为主题的作文500字 服务器与dhcp冲突 专科销售和软件开发哪个有前景 原神账号能换服务器吗 计算机网络技术在电子信息 爬虫爬取数据库 游戏服务器 教程 软件开发网店 网络安全清单整改措施 杰士德软件开发工程师 vb数据库语法 软件开发中可能遇到哪些问题
0