Chapter 14: <string.h>

背景:

     <string.h>这组函数声明是C标准的重要部分.它们支持使用传统的C来操作字符文本数组.更好的整合其他语言进行字符串文本操作,SNOBOL就是一个典型的例子.在所有的C语言中采用空字符作为结束符,如"abc".C标准提供了所用重要的功能函数.这些函数有三种操作形式:

  • men开头的一系列函数.一个参数指向字符串的开始 - 最低下标的元素.另一个参数指定元素个数.

  • strn开头的一系列函数.参数和上面一样,在最后一个元素或者最后一个下标以'\0'结尾.

  • 所有其他的以str开头的系列函数.这些函数只使用一个参数确定字符串的开始.

     如你所料,每组函数都有他独特的用处.

缺点:

     在使用这些函数的时候,你几乎不能发生任何失误操作.这些函数被公开在<string.h>中,但并非最终实现方式.当然,他们是经历了许多年由众多开发者贡献的.等到C标准开始制定的时候,已经太迟去适应他们,太多的问题已经无法去改变,一些常见问题例如:

  • 许多函数在寻找失败的时候会返回一个空指针,为了在这之后你能够进一步安全使用它,你不得不去比较返回值和去测试它.一个指向字符串结尾的指针是一个失败的代码,更有用的表达式.

  • 这些函数拷贝返回一个起始指针到目标区域,这些对于一个更大的表达式有时候是有用的,但结尾地址的拷贝却是更加有用.实际上你会更喜欢多种多样的返回值方式.

  • 有些函数的命名是不可思议的.strcspn和strpbrk,例如,不要大声宣告他们是做什么的.

  • 这一组函数的功能是不完整且不一致的,strnlen和memrchr是两个明显的补充,反之,strncat则是令人惊讶的.

     尽管抱怨这些不优雅的设计,我仍然觉得这些声明在<string.h>中的函数是重要而且有用的,事实上,他们其中一些用于生成内联代码的主要竞争者.许多C程序大量的使用他们,他们是值得去学习和优化的.

C标准解释:

  • size_t : <string.h>中定义的数据类型,等价于unsigned int

  • memcpy : 

    • 原型:

      void *memcpy(void *s1, const void *s2, size_n n);
    • 定义:

      void *(memcpy)(void *s1, const void *s2, size_t n){
          char *su1;
          const char *su2;
          for(su1 = s1, su2 = s2; 0 < n; ++su1, ++su2, --n)
              *su1 = *su2;
          return (s1);
       }
    • 描述: 该函数的作用是从字符串指针s2拷贝n个字符到字符串指针s1中,如果进行复制的对象之间发生重叠,函数未对这种行为进行定义.

  • memmove :

    • 原型:

      void *memmove(void *si, const void *s2, size_n n);
    • 定义:

      void *(memmove)(void *si, const void *s2, size_n n){
        char *sc1;
        const char *sc2;
      
        sc1 = s1;
        sc2 = s2;
      
        if(sc2 < sc1 && sc1 < sc2 + n)
          for(sc1 += n, sc2 += n; 0<n; n--)
            *--sc1++ = *sc2++;
        else
          for(; 0 < n; --n)
            *sc1++ = *sc2++;
        return (s1);
      }
    • 描述: 该函数的作用是从字符串指针s2拷贝n个字符到字符串指针s1中, 复制发生的n个字符从s2指针首先被复制到一个临时的n个字符不重叠的指针对象指向了s1和s2,然后从临时数组复制n个字符到对象指针s1.

  • strcpy :

    • 原型:

      char *strcopy(char *s1, const char *s2);
    • 定义:

      char *(strcopy)(char *s1, const char *s2){
          char *s = s1;
          for(s = s1, (*s++ = *s2++) != '\0';);
          return (s1);
       }
    • 描述: 该函数从函数指针字符串数组s2(包括用于终止的NULL字符)拷贝到字符串数组s1中.如果进行复制的对象之间发生重叠,函数未对这种行为进行定义.

    • 返回: 函数返回字符串数组s1的首地址.

转载于:https://my.oschina.net/odaytudio/blog/292936

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值