C库函数之strcpy,strncpy,memcpy

1、之前在搞项目中的snmp这一块的时候,经常会用到针对字符串的处理。所以strcpy等之类的函数就会用到很多。

   遇到这样的一个问题:比如模板名字为:cmts-profile-1,要将其名字改为cmts-1.显然我们使用strncpy(name1,name2,strlen(name2)),其中name1,name2都是字符串。这样的字符拷贝肯定会出现问题。结果为:cmts-1rofile-1,为什么不是cmts-1呢? 首先我们先来了解一下这4个函数的定义以及用法:


strcpy:

C语言标准库函数strcpy,把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间

char *strcpy(char* dest, const char *src); 其中src一定要是带‘\0’ 的字符串,否则该拷贝会出现异常。该函数需要调用者保证dest >= src 以免造成栈溢出导系统异常。

strncpy:

原型:extern char *strncpy(char *dest, char *src, int n);  

拷贝的字符个数为n,这个时候为了防止数组越界,我们最好的方法是n= sizeof(dest)-1;  len = strlen(dest); 这样拷贝的话就不会出现内存溢出。而我们上面的问题就是strncpy不会帮我们写上'\0',他只负责拷贝。而name1中数据有没有被清空。所以数据只是被覆盖了。所以最好的一种方法是:

首先我们将dest之前的数据清空  memset(dest, 0, sizeof(dest))  在进行拷贝,strncpy(dest,src,sizeof(dest)-1), dest[sizeof(dest)-1] = '\0'

这样的拷贝肯定没有问题,不会出现数据的溢出。这里拷贝的数据内容由我们使用者自己确定。


memcpy:

c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

void *memcpy(void *dest, const void *src, size_t n);

memcpy的使用比strcpy广,一般字符的拷贝使用strcpy,而其他内存的拷贝则一般使用memcpy来进行拷贝。

typedef struct

{

int age;

        char name[32];

        int score;

}stStudent;

stStudent st1,st2;

memcpy(&st1,&st2,szieof(st1)); 这样就可以简单实现内存的拷贝了.

这里不进行讨论内存重叠的问题。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值