zoukankan      html  css  js  c++  java
  • 深夜复习strcpy函数原型竟然暗藏着这么多玄机

    strcpy

    原型声明:extern char *strcpy(char *dest,  char *src)

    头文件;string.h

    功能:把src所指由NULL结束的字符串复制到dest所指的数组中。

    说明:src和所指内存区域不可以重叠且必须有足够的空间来容纳src的字符串,返回指向dest的指针。

    不使用库函数实现strcpy函数(工业级)

     1 char *strcpy(char *strDest, const char *strSrc)
    2 {
    3   assert((strDest != NULL)&&(strSrc !=NULL));
    4   char *tmp = strDest;
    5   while ((*strDest++ = *strSrc++) !='\0')
    6     {
    7       ;//或是 NULL;
    8     }
    9   return tmp;
    10 }
     


    几点说明:

    1.注意编程风格,使用strDest, strSrc 这样增强可读性的名字。

    2.使用断言来检验输入参数的有效性,如果没有对传入参数strDest和strSrc进行检查,一但它们中有一个为NULL,立死!  assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回false,则终止程序执行。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。

    3.使用const来约束strSrc,提高程序的健壮性。如果函数体内的语句试图改动strSrc的内容,编译器将指出错误。

    4.strcpy能把strSrc的内容复制到strDest;为什么还需要char *类型的返回值?

    这是为了实现链式表达。增加了函数的“附加值”。同样功能的函数,如果能合理地提高的可用性,自然就更加理想

    例如:

    int length = strlen(strcpy(strDest, "hello, world!"));

    另一种形式:(入门级)

     1 char *strcpy(char *strDest, const char *strSrc)
    2 {
    3   assert((strDest != NULL)&&(strSrc != NULL));
    4   char *address = strDest;
    5   while (*strSrc != '\0')
    6   {
    7     *strDest++ = *strSrc++;
    8   }
    9   *strDest = '\0';
    10   return address;
    11 }




  • 相关阅读:
    ubuntu 11.10(32位系统)下编译android源码
    12 个基于 Rails 框架开发的 CMS 系统
    36 个 CSS 框架推荐
    再来 10 个新鲜的 HTML5 教程
    汇编程序开发环境搭配(转)
    推荐:介绍一个UndoFramework
    细数 Windows 平台上的 NoSQL 数据库
    使用ShareKit一键分享到Facebook,Twitter等平台
    25个jQuery的编程小抄
    10款iOS高效开发必备的ObjectiveC类库
  • 原文地址:https://www.cnblogs.com/guoyuqiangf8/p/2322187.html
Copyright © 2011-2022 走看看