按照内核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;

}

浅谈C中操作字符串函数的用法(一)的更多相关文章

  1. 浅谈python中的闭包函数

    闭包函数初探 通常我们定义函数都是这样定义的 def foo(): pass 其实在函数式编程中,函数里面还可以嵌套函数,如下面这样 def foo(): print("hello worl ...

  2. [技术]浅谈OI中矩阵快速幂的用法

    前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...

  3. 浅谈JavaScript中的字符串操作

      我想,最为一名开发人员,最实际开发过程中,任何一门语言在开发实际的项目的过程中,都是逃不开字符串的操作的下面笔者就自己日常开发过程中所用到的一些字符串的操作方法做一些陈述和总结,当然,如若读者觉得 ...

  4. 浅谈JS中的高级函数

    在JavaScript中,函数的功能十分强大.它们是第一类对象,也可以作为另一个对象的方法,还可以作为参数传入另一个函数,不仅如此,还能被一个函数返回!可以说,在JS中,函数无处不在,无所不能,堪比孙 ...

  5. 浅谈ES6中的Async函数

    转载地址:https://www.cnblogs.com/sghy/p/7987640.html 定义:Async函数是一个异步操作函数,本质上,Async函数是Generator函数的语法糖.asy ...

  6. 浅谈c++中map插入数据的用法

    map:数据的插入 在构造map容器后,我们就可以往里面插入数据了.这里讲三种插入数据的方法:第一种:用insert函数插入pair数据 map<int, string> mapStude ...

  7. 【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析

    异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待,或死循环. 异常有两个过程,一个是抛出异常:一个是捕捉异常. 抛出异常 抛出异常有三种形式,一是throw, ...

  8. 浅谈.net中数据库操作事务

    .net中的事务 关键几点 概念:1:什么是事务 2:什么时候用事务 3:基本的语法 (1): 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常 ...

  9. 浅谈HTTP中GET、POST用法以及它们的区别

    浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...

随机推荐

  1. es7,es8

    ES7新特性 ES7在ES6的基础上添加了三项内容:求幂运算符(**).Array.prototype.includes()方法.函数作用域中严格模式的变更. Array.prototype.incl ...

  2. Arrays工具类

    1.Arrays工具类针对数组进行操作的工具类 提供了排序查找等功能 2.方法: Arrays.toString(int[] a) 将数据转换成字符串 Arrays.sort(int[] a) 将数组 ...

  3. RSA非对称加密,公钥加密/私钥解密

    非对称加密 package test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFound ...

  4. PHP遍历二叉树

    遍历二叉树,这个相对比较复杂. 二叉树的便利,主要有两种,一种是广度优先遍历,一种是深度优先遍历. 什么是广度优先遍历?就是根节点进入,水平一行一行的便利. 什么是深度优先遍历呢?就是根节点进入,然后 ...

  5. python 包 笔记

    绝对导入和相对导入 我们的最顶级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式: 绝对导入:以glance作为起始 相对导入: ...

  6. .equals()到底是什么意思?

    .equals() 在Java中判断是否相等,与 == 的区别是 .equals() 只判断值是否相等,不管两者是否存在同一地址.而 == 则是判断值与存在地址都得相等 扩展资料: 由equals的源 ...

  7. Office DCOM 组件交互权限设置

    这里以 WORD 为例: 运行 mmc -32 打开控制台. 点击 文件 -> 添加/删除管理单元 ,在 可用的管理单元 中选择 组件服务 ,然后点击 添加 , 确定 . 展开 组件服务节 点直 ...

  8. 【我的前端自学之路】【HTML5】Web Socket

    以下为自学笔记内容,仅供参考. 转发请保留原文链接:https://www.cnblogs.com/it-dennis/p/10508118.html 什么是Web Socket WebSocket ...

  9. MySQL查询缓存总结

    可以通过下面的SQL查看当前查询缓存相关参数状态: show variables like '%query_cache%'; 1)  query_cache_type 查询缓存类型: 0 表示始终不适 ...

  10. Testlink与MantisBT集成

    Testlink与MantisBT集成 关于两者集成的文章网上有很多,但是有些文章可能是作者写的时候自己不理解或有纰漏,有些文章写得是不够详细导致在配置中遗漏什么导致不成功.经过一天的不停尝试,终于完 ...