strcpy与strncpy区别
n代表可以指定字符个数进行赋值,当src字符串长度小于n,dst数组就用额外的’0’字节填充到n长度。
strcpy实现:
// 为了实现链式操作,将目的地址返回,strcopy()可作为其它函数的参数(实参)
char* strcopy(char* dest,const char* src)
{
assert(dest != NULL && src!= NULL); // 指针安全检查
//对dest和src两个指针做循环移动并不断复制src内存的值到dest内存中
//当src内存中的值为’0’时,做最后一次复制
while ((*dest++ = *src++) != '0');
return dest;
}strncpy实现:
char *strncpy(char *dest, const char *src, size_t n)
{
assert(dest != NULL && src != NULL);
char *res = dest;
int offset = 0;
if (strlen(src) < n) //src长度小于n
{
offset = n- strlen(src);
n = strlen(src);
}
while (n--)
{
*dest++ = *src++;
}
while (offset--) //src长度小于n,用’0’填充dest
{
*dest++ = '0';
}
return res; 当n长度大于strlen(dest)时,使用这个函数(与 strcpy 一样),尤其需要注意,不要出现 n>strlen(dst)的情况,如果 n>strlen(dst),那么会破坏dst后面的内存。所以,使用strncpy时,最好自动添加‘0’在结尾。
char buffer[BSIZE];
.
.
strncpy(buffer,name,BSIZE);
buffer[BSIZE-1]=’0’;strcpy与memcpy区别
1.复制的内容不同:strcpy()只能复制字符串,而memcpy()可以复制任意内容,例如字符数组、整型、结构体、类等;
2.复制的方法不同:strcpy()不指定长度,它遇到被复制字符串结束符”0”才结束拷贝,所以容易溢出,memcpy()则是根据其第三个参数决定复制的长度;
3. 用途不同:通常在复制字符串时用strcpy(),而需要复制其他类型数据时则一般用memcpy();
memcpy实现:
//void*代表复制的数据可以是任意类型,之后进行类型间的强制转换
void* memcopy(void* dest,const void* src,size_t count)
{
assert(dest != NULL && src != NULL); // 指针安全检查
char* pDest = (char *)dest; //保存dest首地址
char* pSrc = (char *)src; //保存src首地址
while(count-- > 0) //循环count次,进行复制操作
{
*pDest++ = *pSrc++;
}
return dest; //此时,dest为复制过后内容的首地址
}版权声明:本文为weixin_33069291原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。