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)); 这样就可以简单实现内存的拷贝了.
这里不进行讨论内存重叠的问题。