memcpy、strcpy和strncpy的简介
来源:互联网 发布:mac怎么恢复废纸篓 编辑:程序博客网 时间:2024/06/03 20:30
在C的操作中,对数组类数据进行批量赋值一般通过memcpy、strcpy和strncpy这三种函数进行,这里将为其进行介绍.
这三者的区别在于strcpy和strncpy只能对字符串的数据进行拷贝,无法用于拷贝中间含有NULL的数据。
函数的头文件: string.h
1.memcpy
函数名:void *memcpy(void *dest, void *src, size_t n);
功能:将src所指的地址内容拷贝到dest所指的内容处,其为各种拷贝函数的基础。
它可以用于拷贝包括结构体、整型、字符型、类等各类数据。
注意:
1.source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针.
2.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
注意:source和destin都不一定是数组,任意的可读写的空间均可。
2.strcpy和strncpy
函数名:char *strcpy(char *dest, char *src);
功能:将dest所指地址的字符串拷贝到src所指的地址处,其不限制复制的字符串的长度,会导致缓冲的溢出。
附上gblic里的strcpy原码:
char *STRCPY (char *dest, const char *src)
{
return memcpy (dest, src, strlen (src) + 1);
}
函数名: char *strncpy(char *dest, char *src, size_t n);
功能:将dest所指地址的字符串拷贝到src所指的地址处,若n大于src的长度,则自动用NULL来填充剩余的,否则复制对应长度到所指地址,但会导致字符串没有终止符NULL,其可以克服strcpy的溢出危险。
附上gblic里的strcpy原码:
char *STRNCPY (char *s1, const char *s2, size_t n)
{
size_t size = __strnlen (s2, n);
if (size != n)
memset (s1 + size, '\0', n - size);
return memcpy (s1, s2, size);
}
可以发现,数据的拷贝都是依赖于memcpy的,而strcpy和strncpy均只能适用于字符串的拷贝,无法用于其它数据的拷贝,特别是如果要拷贝的数据中有着NULL的话。
此外,提几个的基于memcpy的函数。
- memcpy、strcpy和strncpy的简介
- strcpy、strncpy 和 memcpy
- strcpy、strncpy 和 memcpy
- strcpy、strncpy和memcpy的区别
- strncpy,strcpy,memcpy的区别
- memcpy,strcpy,strncpy的用法
- strcpy、strncpy、memcpy的区别
- strcpy、strncpy、memcpy的区别
- strcpy、strncpy与memcpy的区别和使用方法
- strcpy,strncpy和strncpy_s的区别 strncpy函数与memcpy函数
- memcpy与strcpy(strncpy)的惨痛经历
- strcpy,strncpy,memcpy的源码分析
- strcpy,strncpy,memcpy,memset的实现
- strcpy,strncpy,strlcpy,memcpy
- memcpy, strncpy, strcpy
- strcpy,strncpy,strlcpy,memcpy
- strcpy strncpy memcpy
- strcpy,strncpy,strlcpy,memcpy
- 51nod 1597 有限背包计数问题 dp
- MongoDB的使用
- Lucene第三天入门
- 基于sklearn的文本特征提取与分类
- 3.1 Spark-RDD算子分类
- memcpy、strcpy和strncpy的简介
- 去耦、旁路、滤波电容的区别
- 我的人生路-离开大学后2
- codeforces Div.2 #429 B.Godsend C. Leha and Function
- 参数(parameters)和超参数(hyperparameters)
- Android ANR问题分析
- .Net,Dll扫盲篇,如何在VS中调试已经编译好的dll?
- MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要区别
- java -length的三种用法