浅谈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;

}

原文地址:https://www.cnblogs.com/tslDream/p/6739423.html