C语言strcpy、strncpy函数是否会复制‘\0‘结束符

1.首先看看strcpy函数的原型

/* strcpy函数原型*/
char *strcpy(char *est,const char *src)
{
    assert((dest!=NULL)&&(src!=NULL));
    char *address=dest;
    while((*dest++ = *src++)!='\0');//直到src字符串结束符'\0'
    return address;
}

从while循环条件来看,dest会复制src的'\0',如果看不懂这一行的话可以查看:关于c语言字符串指针的自加(++)和(+=1)_猪突猛进进进的博客-CSDN博客C语言字符串指针的自加*str++,*(str++)和*(str+=1),*str+=1https://blog.csdn.net/DRAXY/article/details/123758336?spm=1001.2014.3001.5502

(*dest++ = *src++)这个的值就是*src++的值,验证代码如下:

运行结果箭头处就是'\0' 

可见,dest会一直复制到'\0'才会结束循环,所以'\0'也复制到dest中去了。

2.strncpy函数

如果遇到不需要复制'\0'结束符的情况的话可以使用strncpy函数,其函数原型如下:

char* strncpy(char* dest, const char* src, int len)  
{  
            assert(dest!=NULL && src!=NULL);  
            char* temp=dest;  
            int i=0;  
            while(i++ < len  && (*temp++ = *src++)!='\0')  
            {}  
            if(*(temp)!='\0')  
                 *temp='\0';  
            return dest;  
}

第三个参数能够限制复制长度,就能不复制'\0'了。

        分别将buf1、buf2、buf3、buf4的长度限制为9、10、11、12,长度为9的buf1只能复制到hellohell(缺少最后一个o,且没有结束符),长度为10的buf2只能复制hellohello(也没有结束符),长度为11的buf3能复制hellohello'\0',长度为12的buf4能复制hellohello'\0'(所以buf4的实际内容为hellohello'\0''c')。

运行结果如下:

         然而buf1没有仅输出hellohello,buf2也没有仅输出hellohello,buf4也没输出hellohello'\0''c'。

 下面分析原因:

1.buf1的输出

        因为buf1只复制了hellohell没有'\0',所以printf输出时没有遇到'\0'就没有结束打印,而是存放在缓冲区,等待遇到'\0'时再输出打印,第一次buf1写入缓冲区hellohell,第二次遇到buf2的hellohello,但是仍然没有遇到'\0',继续写入缓冲区,第三次遇到buf3的hellohello'\0',写入缓冲区,且有'\0'所以,printf输出结果到屏幕上,所以buf1的打印内容就如上图运行结果所示。

2.buf2的输出

        buf2同buf1一样,先将自己的hellohello写入缓冲区,第二次遇到buf3的hellohello'\0',才将内容打印在屏幕上,如上如所示。

3.buf3的输出

        buf3的复制就如strcpy的功能一样,第三个参数的值恰好是字符内容长度(不包括'\0')加一,所以复制到'\0'时结束复制,输出如上图所示。

4.buf4的输出

        buf4经memset、strncpy后内容应该为hellohello'\0''c',printf打印时,遇到'\0'就结束,所以没有打印字母c。

        从上方结果可以看出strncpy的用法细节,使用时应该注意第三个参数--复制的最大长度的控制,以免造成一些意料外的结果。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值