01 strcpy()、memset()函数详解

strcpy():strcpy(dest,src);    strcpy把src所指向以'\0'结尾的字符串复制到dest所指的数组中,返回指向dest的指针。

     当sizeof(dest)>=sizeof(src)时,拷贝正确,并在dest字符串后面加入'\0';

     当sizeof(dest)<sizeof(src)时,拷贝出错。这个循环会一直执行,直到循环条件为空,即'\0',也就是说,如果strDest所指的存储空间不够大的话,这个函数会将strSrc中的部分内容拷贝到strDest所指内存空间后面的内存中。而strDest所指空间后面的内存却是不可知的,有可能已经被其他资源占用了,这样就会破坏原先存储的内容,导致系统崩溃。

 

strncpy():strncpy(dest,src,n);    strncpy把src所指向以'\0'结尾的字符串的前n个字符复制到dest所指的数组中,返回指向dest的指针。

     当n>=sizeof(src)时,拷贝正确,并在dest字符串后面加入'\0';

     当n<sizeof(src)时,只拷贝src前n-1个字符串到dest,不会为dest字符串后面加入'\0';所以是不安全的,复制完后需要手动添加字符串的结束符才行。

 

  strcpy()函数是C语言中的一个复制字符串的库函数,以下将详细解释说明一下:

· 函数声明以及实现代码
char * strcpy(char *dst,const char *src)   
{
    if((dst==NULL)||(src==NULL))
         
           return NULL; 
 
    char *ret = dst; //[1]
 
    while ((*dst++=*src++)!='\0'); //[2]
 
    return ret;//[3]
}
(1)const 修饰:源字符串参数用const修饰,防止修改源字符串;

(2)空指针检查:源指针和目的指针都有可能会出现空指针的情况,所以应该对其进行检查;

(3)为什么要设置ret 指针以及返回ret指针的位置[3],由于目的指针dst已经在进行移动了,所以用辅助指针ret表明首指针;

(4)以上所示[2]处,为简单的字符串的复制过程,正好表明strcpy函数遇到'\0'将会停止;另外while ((*dst++=*src++)!='\0');可写为:

while ((*dst=*src)!='\0'){   //该判断决定复制的字符串结尾为"\0"

     dst++;

     src++;}
所以,dst指针已经移动,使用ret进行返回。

 

char* strncpy(char* dest, const char* source, size_t count)
{
    char* start=dest;
    while (count && (*dest++=*source++))
        count--;
    if(count)                                              //当sizeof(source)> count,count=0;当sizeof(source)< count,后加'\n'
        while (--count)
            *dest++='\0';
    return(start);
}

memset主要用于为新申请的内存进行初始化,它是对较大的结构体和数组进行清零操作的一种最快方法。 
函数原型:void *memset(void *s, int ch, size_t n); 
函数解释:将s中前n个字节用ch填充,并返回s。 
对于这些最基本的函数,总有一种冲动想知道其是怎么实现的。 
下面就是根据源码而来的memset实现:

void* memset(void* dst,int val, size_t count)
{
    void* ret = dst;
    while(count--)
    {
        *(char*)dst = (char)val;
        dst = (char*)dst + 1; //移动一个字节
    }
    return ret;
}
 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值