strncpy & memcpy

strncpy和memcpy的用途:从一块内存复制一段连续的数据到另一块内

区别:终结标识不同。

strncpy会比较每个字符是否为'\0'以判定是否继续复制;

memcpy不管内存数据内容,复制指定的长度(不讨论源串有错误或者目的空间不够等出错的情况)。

 

对于字符串类型,二者效果一直,但是对于二进制格式或者exe之类的序列化文件,复制最好采用memcpy。今天拷贝一个mcpack的结构体,开始使用strncpy,觉着代码写的没问题,但是解析完的字符串一直有问题,后来尝试memcpy,竟然成功了。

所以,在选用使用哪种接口时,最好先看一下自己要处理的数据类型。

 

下面贴出两个接口的定义及实验原理:

 

    1、memcpy

函数原型:extern void *memcpy(void *dest, const void *src, size_t count);
用法:#include<string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
注意:和strcpy相比,memcpy不是遇到’/0’就结束,而是一定会拷贝完n个字节。

函数实现代码:

void *memcpy(void *dest, const void *src, size_t count)
{

     assert(dest!=NULL&&src!=NULL);
     char *tmp = dest;
     const char *s = src;

     while (count--)
     *tmp++ = *s++;
     return dest;
}

 

2.strncpy
函数原型:extern char *strncpy(char *dest, char *src, int n); 
用法:#include <string.h>

功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。
说明:
        如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
        如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
        src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
        返回指向dest的指针(该指向dest的最后一个元素)
实现代码:

char * strncpy(char * dest,const char *src,size_t count)
{    
    char *tmp = dest;
    while (count-- && (*dest++ = *src++) != '/0')
    /* nothing */;
    return tmp;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值