<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

最新文章

  1. Redis的缓存策略和主键失效机制
  2. mac系统,git上刚刚checkout出来的文件,一检查,发现已经被修改过了,怎么破???
  3. 继续畅通工程-Floyd
  4. NOI2016 山西省省选 第二题序列
  5. NOIP201405生活大爆炸版石头剪刀布
  6. oracle线程数更改
  7. AMQ学习笔记 - 13. Spring-jms的配置
  8. debian7编译内核
  9. 《C语言程序设计现代方法》第4章 编程题
  10. (转载)PHP isset()函数作用
  11. 杭电oj 2095 &amp; 异或^符号在C/C++中的使用
  12. ORACLE常用数据库类型(转)
  13. 201521123006 《Java程序设计》第5周学习总结
  14. jdk源码-&gt;集合-&gt;ArrayList
  15. python-类内置属性和内置方法
  16. Linux CentOS7下安装Python3及其setuptools、pip
  17. C#中webbrowser与javascript(js)交互的方法
  18. windows生成dump文件
  19. 黑盒测试实践——day01
  20. 【BZOJ3930】选数

热门文章

  1. nodejs使用express中静态资源托管(express.static())时遇到的bug
  2. JAVA研发面试题
  3. Codeforces Round #631 (Div. 2) D. Dreamoon Likes Sequences (bitmasks +dp )
  4. (3)SQL Server表分区
  5. 如何更换 App icon
  6. PTA数据结构与算法题目集(中文) 7-3
  7. 【STM32项目笔记】STM32CubeMX+Keil+Proteus联合实现LED闪烁
  8. python 函数--闭包函数
  9. 2017蓝桥杯最大公共子串(C++B组)
  10. Boyer-Moore字符串搜索(BM算法)的Python实现