zoukankan      html  css  js  c++  java
  • 浅谈C中操作字符串函数的用法(一)

    按照内核string.h中函数的顺序进行大概的介绍,若干函数会给出一个简单的例子。有不足之处还希望各位看到的留言告知。

    一、memcpy:

    函数原型:extern void * memcpy(void *dest, const void *src, size_t n);

    函数作用:将从src地址开始的n个字节拷贝到dest开始的地址中。返回值是指向dest的指针。

    源码:

    extern void *memcpy(void *dest, const void *src, size_t n)

    {

      void *ptmp_void = dest;

      size_t tmp_size1, tmp_size2;

      if (!n) {

       return ptmp_void; 

      }

      if ((long)dest & 1) {

        char *str_dest = dest;

        const char *str_src = src;

        *str_dest++ = *str_src;

        dest = str_dest;

        src = str_src;

        n--;

      }

      if (n > 2 && (long)dest & 2) {

        short *s_dest = dest;

        const short *s_src = src;

        *s_dest++ = *s_src;

        dest = s_dest;

        src = s_src;

        n -= 2;

      }

      tmp_size1 = n >> 2;

      if (tmp_size1) {

        long *l_dest = dest;

        const long *l_src = src;

        for (; tmp_size1; tmp_size1--) {

          *l_dest ++ = *l_src;

        }

        dest = l_dest;

        src = l_src;

      }

      if (n & 2) {

      }

      if (n & 2) {

        short *s_dest  =dest;

        const short *s_src = src;

        *s_dest++ = *s_src++;

        dest = s_dest;

        src = s_src;

      }

      if (n & 1) {

        char *str_dest = dest;

        const char *str_src = src;

        *str_dest = *str_src;

      }

      return ptmp_void;

    }

    二、memmove:

    函数原型:extern void *memmove(void *dest, void *src, size_t n);

    函数作用:从src中拷贝n个字节到dest,如果目标区域重合,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

    与memcpy的区别:当拷贝的dest和src有内存区域重合的时候,memmove更大程度的保证正确,而memcpy不能保证一定正确,但很多常用情况是正确的。相比较而言,memmove更为安全。

    源码:

    extern void *memmove(void *dest, const void *src, size_t n)

    {

      unsigned char *tmp_dest = dest;

      const unsigned char *tmp_src = src;

      if (dest == src) {

        return dest;

      }

      if (dest < src) {

        return memcpy(dest, src, n);

      }

      while (n -- ) {

        tmp_dest[n] = tmp_src[n];

      }

      return dest;

    }

    三、memccpy:

    函数原型:extern void *memccpy(void *dest, void *src, int c, size_t n);

    函数作用:由src所指内存区域复制不多于count个字节到dest所指内存区域,如果遇到字符c则停止复制。返回值代表如果c没有被复制,则返回NULL,否则,返回字符c 后面紧挨一个字符位置的指针。意思就是只拷贝src中字符c之前的字符。

    四、memset:

    函数原型:extern void *memset(void *s, int c, size_t n);

    函数作用:对s的前n个字节的每个字节都设置为c.

    源码:extern void *memset(void *s, int c, size_t n)

    {

      int i;

      char *ss = s;

      for (i = 0; i < n; i++) {

        ss[i] = c;

      }

      return s;

    }

    五、memcmp:

    函数原型:extern int memcmp(const void *s1, const void *s2, size_t n);

    函数作用:比较s1和s2中前n个字节。

    源码:extern int memcmp(const void *s1, const void *s2, size_t n)

    {

      const unsigned char *su1, *su2;

      int res = 0;

      for(su1 = s1, su2 = s2; 0 < count; ++su1, ++su2, n--) {

        if ((res = *su1 - *su2) != 0) {

          break;

        }

      }

      return res;

    }

    六、memchr:

    函数原型:extern void *memchr(const void *s1, int c, size_t n);

    函数作用:查找s1中的字符c。

    源码:extern void *memchr(const void *s1, int c, size_t n)

    {

      const unsigned char *p =s;

      while(n--) {

        if ((unsigned char)c == *p++) {

          return (void *)(p - 1);

        }

      }

      return NULL;

    }

  • 相关阅读:
    postman 安装,配置,鉴权
    monkey操作,获取包名,参数,日志,百分比
    monkey环境搭建
    postman接口测试&压力测试
    Fiddler介绍(PC端+Android,IOS端,弱网)
    软件测试的环境搭建
    python2.x- selenium-robot framework自动化测试环境搭建
    SVN的简单操作,版本控制
    svn介绍和安装
    js 函数和函数的参数
  • 原文地址:https://www.cnblogs.com/tslDream/p/6739423.html
Copyright © 2011-2022 走看看