strcpy,strncpy,strlcpy,strdup介绍

1.  strcpy

strcpy函数的原型是:

char * strcpy(char* dest, const char* src)

strcpy的实现经常要注意的细节是:

(1)判断地址是否为空

(2)参数只有两个地址,没有拷贝的长度。拷贝到'\0‘时就会终止,要保证最终dest末尾是'\0'。

(3)要保证目标字串的长度足够,能够容纳原串的长度。

(4)因为拷贝是dest会移动,而最终要返回的是拷贝后字符串的起始地址,因此要先保存dest的地址,便于最终返回。

(5)dest容易发生溢出,并且dest和src所在内存区域不能重叠,否则复制会发生错误。

char* mystrcpy(char* dest, const char* src)
{
	assert(dest!=NULL && src!=NULL);

	char* temp=dest;

	while((*temp++ = *src++)!='\0');

	return dest;
}

2.  strncpy

原型:extern char *strncpy(char *dest, const 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的最后一个元素)  

在一般情况下,使用strncpy后需要手动加入'\0';

char *mystrncpy(char* dest, const char*src, int n)
{
    assert(dest != NULL && src != NULL);
    char *tmp = dest;
    while(n && (*tmp++ = *src++) != '\0')n--;
    while(n > 0)
    {
        *tmp++ = '\0';
        n--;
    }
    return dest;
}
3.strlcpy

原型:extern size_t strlcpy(char *dest, const char *src, int count);

功能:复制count-1个字符,从src到dest,并且在dest末尾加上\0,返回src的字符串长度;

size_t strlcpy(char *dest, char *src, size_t count)
{
    assert(dest != NULL && src != NULL);
    char *tmp = dest;
    char *s = src;
    size_t n = count;
    if(n != 0 && --n != 0)
    {
        while(n && (*tmp++ = *src++) != '\0') n--;
    }
    if(n == 0)
    {
        if(count != 0) *tmp = '\0';
        while(*src++ != '\0');
    }
    return src - s - 1;
}

4.strdup

函数原型:extern char *strdup(const char *src);

strdup()主要是拷贝字符串s的一个副本,由函数返回值返回,这个副本有自己的内存空间,和s不相干。strdup函数复制一个字符串,使用完后要记得删除在函数中动态申请的内存,strdup函数的参数不能为NULL,一旦为NULL,就会报段错误,因为该函数包括了strlen函数,而该函数参数不能是NULL。

char *strdup(const char *src)
{
    size_t len = strlen(src) + 1;
    void *new = malloc(len);
    if(new == NULL)return NULL;
    return (char*)memcpy(new, src, len);
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值