C语言strcpy、strncpy函数是否会复制‘\0‘结束符
C语言strcpy、strncpy函数会复制'\0'结束符到目标字符串,以及strncpy的第三个参数细节
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的用法细节,使用时应该注意第三个参数--复制的最大长度的控制,以免造成一些意料外的结果。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)