<cstring>是c++对c中的<string.h>进行了重写,这两个头文件中的函数用法是一样的,所以在用的时候包含哪个头文件都行。下面介绍一下

<cstring>头文件里常用的两个函数;分别是memset和memcpy。

1. memset(void* buffer,int a,size_t n);将buffer当前所指位置后面的n个字节填充为a,注意memset是按字节对内存块进行填充的,所以只能

填充0或-1。buffer是一个指针或者数组名,a是int型数据,特别注意a只能是0或-1,n是内存的大小,即字节数。一般用memset()来初始化数组,

效率是比较高的,初始化后可以防止出现“野值”。例如现在有这样一个数组:int a[10];要用0对数组a进行填充,方法为:memset(a, 0, 10*sizeof(int)),

注意第三个参数了,不要搞错。

另外再说一下,当buffer是静态的时候,即buffer是数组的话,第三个参数还可以写成:sizeof(buffer),因为此时buffer是一个数组,有确定的内存大小,

所以在按照字节填充的时候是没有问题的;但是如果bufffer如果是动态的话,即buffer是一个指针,第三个参数就不能像:sizeof(buffer)这样写了,只能

老老实实的写成这个样子:10*sizeof(int)。下面是我在<string.h>头文件中找到的memset()函数的原型:

2. memcpy(a, b, size_t n);把b当前所指位置之后的n个字节中的数据复制到数组a,和上面的memset()差不多,虽然它们的功能不同,但都是按照字节进行操作的。

例如有两个数组:int a[5]={1,2,3,4,5},b[4]={6,7,8,9};现在要把a中的元素复制到b中:memcpy(b, a, 4*sizeof(int)),由于b的长度是4(即20个字节),所以只能把a当前

所指位置之后的20个字节的数据复制到b中,否则会越界。

还有一点要说一下,memcpy()还可以实现把一个数组中的元素复制到一个vector容器中,此时第一个参数为容器,但不能是容器名,第二个参数是数

组名;用这样的形式:memcpy((int*) &a[0], b, size_t n);其中&a[0]代表容器a的首元素地址,而(int*)是memcpy()函数要求的。另外补充一下,数组名即

是首地址,但容器名则不是,所以要把数组中的数据拷贝到容器中,第一个参数不能是容器名,注意区分数组名和容器名。(此种方法慎用,推荐使用下面这个方法)

此外,要实现把一个数组拷贝到容器中,还有一个方法(推荐使用):

int a[5]={1,2,3,4,5};

vector<int> v(a,a+5);

即在声明容器的时候可以直接指定复制,非常方便。下面附上两个函数的使用代码及结果

 #include<iostream>
#include<vector>
#include<cstring>
using namespace std;
int main()
{
int a[]={,,,,};
int b[]={,,,}; cout<<"把数组a复制到数组b中后,b中元素为:";
memcpy(b,a+,*sizeof(int)); //从a+1开始,把数组a复制到数组b中,复制20个字节的数据
for(int i=;i<;i++) //a和b所指位置是可以修改的,即a的复制区间是可以改变的,存放到b中的起始位置也是可以改变的
cout<<b[i]<<" "; vector<int> v1(a,a+); //必须先初始化v1,并且v1的长度不小于a的长度,否则复制的时候会越界
cout<<"\n把数组a复制到容器v1中后,v1中元素为:";
for(int i=;i<v1.size();i++)
cout<<v1[i]<<" "; memset(a,,*sizeof(int)); //分别用0和-1填充数组a
cout<<"\n用0填充数组a:";
for(int i=;i<;i++)
cout<<a[i]<<" ";
cout<<"\n用-1填充数组a:";
memset(a,-,*sizeof(int));
for(int i=;i<;i++)
cout<<a[i]<<" ";
cout<<"\n用1填充数组b:";
memset(b,,*sizeof(int)); //用0和-1以外的数填充会产生非法值
for(int i=;i<;i++)
cout<<b[i]<<" ";
cout<<"\n";
return ;
}

2020-04-25   21:47:02

<cstring>中常用的两个函数memset()和memcpy()的更多相关文章

  1. LoadRunner中常用的字符串操作函数

    LoadRunner中常用的字符串操作函数有:                strcpy(destination_string, source_string);               strc ...

  2. 【linux C】C语言中常用的几个函数的总结【一】

    1.memset函数 定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构.在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”.每种类型的变量都有各自的 ...

  3. PHP开发中常用的字符串操作函数

    1,拼接字符串 拼接字符串是最常用到的字符串操作之一,在PHP中支持三种方式对字符串进行拼接操作,分别是圆点.分隔符{}操作,还有圆点等号.=来进行操作,圆点等号可以把一个比较长的字符串分解为几行进行 ...

  4. PHP中常用的字符串格式化函数总结

    注意:在PHP中提供的字符串函数处理的字符串,大部分都不是在原字符串上修改,而是返回一个格式化后的新字符串. 一.取出空格和字符串填补函数 空格也是一个有效的字符,在字符串中也会占据一个位置.用户在表 ...

  5. ACM中常用的C/C++函数

    只大概说明功能,具体用法请自行百度. C函数 memset:按字节填充地址空间 sscanf:从一个字符串中格式化读取变量 sprintf:将变量格式化写入字符串中 atoi:字符串转int atof ...

  6. php中常用的字符串查找函数strstr()、strpos()实例解释

    string strstr ( string $haystack , mixed $needle [, bool $before_needle = false ] ) 1.$haystack被查找的字 ...

  7. web 中常用的两种上传文件的方法总结

    这里我们来总结整理一下常用的两种文件上传方式以及要注意的东西: 1.springmvc .MultipartFile 的上传方式. 2.org.apache.commons.fileupload 使用 ...

  8. SQL中常用的字符串LEFT函数和RIGHT函数详解!

    今天继续整理日常可能经常遇到的一些处理字符串的函数,记得点赞收藏!以备不时之需!看到最后有惊喜! LEFT(expression, length)函数 解析:从提供的字符串的左侧开始提取给定长度的字符 ...

  9. 开发中常用的两个JSON方法

    参考文章:https://juejin.cn/post/6844903711127404557 在前端开发过程中,有两个非常有用的方法来处理 JSON 格式的内容: JSON.parse(string ...

随机推荐

  1. JavaScript/JQuery对图片放大或缩小失效

    将图片的父元素的宽度和高度也设置后,问题解决.Got it!

  2. 使用vue-cli脚手架创建vue项目

    使用vue-cli脚手架创建vue项目 首先,你已经安装了node. 使用vue-cli@2 创建项目 执行 命令: npm i -g vue-cli@2 //全局安装vue-cli@2脚手架 : v ...

  3. 基于华为云IoT Studio自助生成10万行代码的奥秘

    华为IoT小助手们搬好板凳.备好笔记本.听了HDC.Cloud的几场华为云技术架构师的直播讲课,感觉获益匪浅却又似懂非懂,直后悔自己没有好好打下基础.为了避免再次出现这样的情况,小助手偷偷跑去找了华为 ...

  4. /usr/lib/jvm/java-1.8.0-openjdk/release 没有这个文件或目录

    在Java1.8以上,安装以后再安装目录是自动生成一个release文件,用于记录Java和系统信息.但是在centos中,如果你的Java是在安装系统时选择自动安装的,那么在标题那个目录下,也就是j ...

  5. Halo博客的搭建

    今日主题:搭建一个私人博客 好多朋友和我说,能不能弄一个简单的私人博客啊,我说行吧,今天给你们一份福利啦! 搭建一个私人博客,就可以在自己的电脑上写博客了 Halo Halo 是一款现代化的个人独立博 ...

  6. Java8 学习笔记--函数式接口与lambda表达式的关系

    在java中,lambda表达式与函数式接口是不可分割的,都是结合起来使用的. 对于函数式接口,我们可以理解为只有一个抽象方法的接口,除此之外它和别的接口相比并没有什么特殊的地方.为了确保函数式接口的 ...

  7. 51单片机内存条(64K)

    51单片机内存条扩展(64K) 设计时间:2015年 实现功能:51单片机SRAM扩展 51单片机64K内存条

  8. Shell基础应用

                                                                  Shell基础应用 案例1:Shell基础应用 案例2:简单Shell脚本的 ...

  9. MyBatis(九):动态SQL

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...

  10. Django常用的第三方包

    Django常用的第三方包 API开发 djangorestframework django-rest-multiple-models django-cors-headers 查询 django-fi ...