strcpy

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C语言中函数strcpy,strncpy,strlcpy的用法分类:C的往事2011-05-1118:553080人阅读评论(2)收藏举报语言cpathfreebsdnulldstC语言中函数strcpy,strncpy,strlcpy的用法strcpy,strncpy,strlcpy的用法好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。1.strcpystrcpy是依据/0作为结束判断的,如果to的空间不够,则会引起bufferoverflow。strcpy常规的实现代码如下(来自OpenBSD3.9):char*strcpy(char*to,constchar*from){char*save=to;for(;(*to=*from)!='/0';++from,++to);return(save);}但通常,我们的from都来源于用户的输入,很可能是非常大的一个字符串,因此strcpy不够安全。2.strncpy在ANSIC中,strcpy的安全版本是strncpychar*strncpy(char*s1,constchar*s2,size_tn);但strncpy其行为是很诡异的(不符合我们的通常习惯)。标准规定n并不是sizeof(s1),而是要复制的char的个数。一个最常见的问题,就是strncpy并不帮你保证/0结束。charbuf[8];strncpy(buf,abcdefgh,8);看这个程序,buf将会被abcdefgh填满,但却没有/0结束符了。另外,如果s2的内容比较少,而n又比较大的话,strncpy将会把之间的空间都用/0填充。这又出现了一个效率上的问题,如下:charbuf[80];strncpy(buf,abcdefgh,79);上面的strncpy会填写79个char,而不仅仅是abcdefgh本身。strncpy的标准用法为:(手工写上/0)strncpy(path,src,sizeof(path)-1);path[sizeof(path)-1]='/0';len=strlen(path);3.strlcpy//Copysrctostringdstofsizesiz.Atmostsiz-1characters//willbecopied.AlwaysNULterminates(unlesssiz==0).//Returnsstrlen(src);ifretval=siz,truncationoccurred.size_tstrlcpy(char*dst,constchar*src,size_tsiz);而使用strlcpy,就不需要我们去手动负责/0了,仅需要把sizeof(dst)告之strlcpy即可:strlcpy(path,src,sizeof(path));len=strlen(path);if(len=sizeof(path))printf(srcistruncated.);并且strlcpy传回的是strlen(str),因此我们也很方便的可以判断数据是否被截断。[*一点点历史*]strlcpy并不属于ANSIC,至今也还不是标准。strlcpy来源于OpenBSD2.4,之后很多unix-like系统的libc中都加入了strlcpy函数,我个人在FreeBSD、Linux里面都找到了strlcpy。(Linux使用的是glibc,glibc里面有strlcpy,则所有的Linux版本也都应该有strlcpy)但Windows下是没有strlcpy的,对应的是strncpy和memset函数1strncpy原型:externchar*strncpy(char*dest,char*src,intn);用法:#includestring.h功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。说明:如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。举例://strncpy.c#includesyslib.h#includestring.hmain(){char*s=GoldenGlobalView;char*d=Hello,GGVProgrammers;char*p=strdup(s);clrscr();textmode(0x00);//enable6linesmodestrncpy(d,s,strlen(s));printf(%s/n,d);strncpy(p,s,strlen(d));printf(%s,p);getchar();return0;}2memcpy原型:externvoid*memcpy(void*dest,void*src,unsignedintcount);用法:#includestring.h功能:由src所指内存区域复制count个字节到dest所指内存区域。说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。举例://memcpy.c#includesyslib.h#includestring.hmain(){char*s=GoldenGlobalView;chard[20];clrscr();memcpy(d,s,strlen(s));d[strlen(s)]=0;printf(%s,d);getchar();return0;}C语言中函数strcpy,strncpy,strlcpy的用法分类:C的往事2011-05-1118:553082人阅读评论(2)收藏举报语言cpathfreebsdnulldstC语言中函数strcpy,strncpy,strlcpy的用法strcpy,strncpy,strlcpy的用法好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。1.strcpystrcpy是依据/0作为结束判断的,如果to的空间不够,则会引起bufferoverflow。strcpy常规的实现代码如下(来自OpenBSD3.9):char*strcpy(char*to,constchar*from){char*save=to;for(;(*to=*from)!='/0';++from,++to);return(save);}但通常,我们的from都来源于用户的输入,很可能是非常大的一个字符串,因此strcpy不够安全。2.strncpy在ANSIC中,strcpy的安全版本是strncpychar*strncpy(char*s1,constchar*s2,size_tn);但strncpy其行为是很诡异的(不符合我们的通常习惯)。标准规定n并不是sizeof(s1),而是要复制的char的个数。一个最常见的问题,就是strncpy并不帮你保证/0结束。charbuf[8];strncpy(buf,abcdefgh,8);看这个程序,buf将会被abcdefgh填满,但却没有/0结束符了。另外,如果s2的内容比较少,而n又比较大的话,strncpy将会把之间的空间都用/0填充。这又出现了一个效率上的问题,如下:charbuf[80];strncpy(buf,abcdefgh,79);上面的strncpy会填写79个char,而不仅仅是abcdefgh本身。strncpy的标准用法为:(手工写上/0)strncpy(path,src,sizeof(path)-1);path[sizeof(path)-1]='/0';len=strlen(path);3.strlcpy//Copysrctostringdstofsizesiz.Atmostsiz-1characters//willbecopied.AlwaysNULterminates(unlesssiz==0).//Returnsstrlen(src);ifretval=siz,truncationoccurred.size_tstrlcpy(char*dst,constchar*src,size_tsiz);而使用strlcpy,就不需要我们去手动负责/0了,仅需要把sizeof(dst)告之strlcpy即可:strlcpy(path,src,sizeof(path));len=strlen(path);if(len=sizeof(path))printf(srcistruncated.);并且strlcpy传回的是strlen(str),因此我们也很方便的可以判断数据是否被截断。[*一点点历史*]strlcpy并不属于ANSIC,至今也还不是标准。strlcpy来源于OpenBSD2.4,之后很多unix-like系统的libc中都加入了strlcpy函数,我个人在FreeBSD、Linux里面都找到了strlcpy。(Linux使用的是glibc,glibc里面有strlcpy,则所有的Linux版本也都应该有strlcpy)但Windows下是没有strlcpy的,对应的是strncpy和memset函数1strncpy原型:externchar*strncpy(char*dest,char*src,intn);用法:#includestring.h功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。说明:如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。举例://strncpy.c#includesyslib.h#includestring.hmain(){char*s=GoldenGlobalView;char*d=Hello,GGVProgrammers;char*p=strdup(s);clrscr();textmode(0x00);//enable6linesmodestrncpy(d,s,strlen(s));printf(%s/n,d);strncpy(p,s,strlen(d));printf(%s,p);getchar();return0;}2memcpy原型:externvoid*memcpy(void*dest,void*src,unsignedintcount);用法:#includestring.h功能:由src所指内存区域复制count个字节到dest所指内存区域。说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。举例://memcpy.c#includesyslib.h#includestring.hmain(){char*s=GoldenGlobalView;chard[20];clrscr();memcpy(d,s,strlen(s));d[strlen(s)]=0;printf(%s,d);getchar();return0;}strcpy原型:externchar*strcpy(char*dest,char*src);用法:#includestring.h功能:把src所指由NULL结束的字符串复制到dest所指的数组中。说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。举例://strcpy.c#includesyslib.h#includestring.hmain(){char*s=GoldenGlobalView;chard[20];cl

1 / 27
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功