当前位置: 代码迷 >> 综合 >> memcpy、strcpy和strncpy的简介
  详细解决方案

memcpy、strcpy和strncpy的简介

热度:42   发布时间:2023-12-14 08:06:31.0

在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的函数。


  相关解决方案