`
javasalatu
  • 浏览: 725023 次
  • 性别: Icon_minigender_2
  • 来自: 北京
博客专栏
96df99eb-e89d-3228-9c8e-967fc745ec52
程序员的自我经营之道
浏览量:7710
文章分类
社区版块
存档分类
最新评论

从这篇文章可以看出有些错误,由此可以看出,还是看msdn要好的多,这是我的经验

阅读更多

建议大家多看msdn,下面的有的函数说明有的地方有错误,不管是谁写的,都不能保证没有错误,需要提醒大家,在看书的时候要保持怀疑的态度,兼容并包,要亲手试试,才能将书本的知识转化为自己的东西。

strcpy与strncpy函数

(1) Memset
原型:extern void *memset(void *buffer, int c, int count);
用法:#include <string.h>
功能:把buffer所指内存区域的前count个字节设置成字符c。
说明:返回指向buffer的指针。用来对一段内存空间全部设置为某个字符
例:char a[10];memset(a, '\0', sizeof(a));
memset可以方便的清空一个结构类型的变量或数组。
如:
struct _test
{
char s[10];
int x;
int y;
};
变量
struct _test st;
(1)一般清空st的方法如下:
st.s[0] = '\0';
st.x = 0;
st.y = 0;
(2) 用memset方法如下:
memset(&st,0,sizeof(struct _test));
数组:
struct _test st[10];
则用 memset(st,0,sizeof(struct _test)*10);


(2)memcpy
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#include <string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
可以拿它拷贝任何数据类型的对象。


例:char a[10],b[5];
memcpy(b, a, sizeof(b));
/*注意如果用sizeof(a),会造成b的内存地址溢出*/
(3) Strcpy
原型:extern char *strcpy(char *dest,char *src);
用法:#include <string.h>
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。

例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出

(4) 三者区别
memset 主要应用是初始化某个内存空间。
memcpy 是用于copy源空间的数据到目的空间中。
strcpy 用于字符串copy,遇到‘\0’,将结束。
如果理解了这些,就能知道它们的区别:
例如初始化某块空间的时候,用到memcpy,那么就显得很笨拙了。
int m[100]
memset((void*)m,0x00,sizeof(int)*100); //Ok!
memcpy((void*)m,"\0\0\0\0....",sizeof(int)*100); //Not Ok!

Strcpy和Strncpy的区别- -
第一种情况:
char* p="how are you ?";
char name[20]="ABCDEFGHIJKLMNOPQRS";


strcpy(name,p); //name改变为"how are you ? OPQRS " ====>错误!
strncpy(name,p,sizeof(name)) //name改变为"how are you ? " ====>正确!

第二种情况:
char* p="how are you ?";
char name[20];

strcpy(name,p); //name改变为"how are you ? 未知字符 " ====>错误!
name[sizeof(name)-1]='\0' //和上一步组合,得到正确的结果!
strncpy(name,p,sizeof(name)); //name改变为"how are you ? " ====>正确!

第三种情况:
char* p="how are you ?";
char name[10];

strcpy(name,p); //name改变为"how are yo" ====>无结束符'\0',错误!
name[sizeof(name)-1]='\0' //和上一步组合,弥补结果。但要注意,字符传递错误!
strncpy(name,p,sizeof(name)); //和单纯的一步strcpy结果一样!

================================================
总结:strcpy
如果源长>目标长,则将源长中等于目标长的字符拷贝到目标字符串
如果源长<目标长,则源长全部拷贝到目标字符串,不包括'\0'
strncpy
如果目标长>指定长>源长,则将源长全部拷贝到目标长,自动加上'\0'
如果指定长<源长,则将源长中按指定长度拷贝到目标字符串,不包括'\0'
如果指定长>目标长,error happen!

strncpy(sptsf_cert.peer_ditm_no,clr_total.payint_acc+7,8) //从第8位后8位拷贝
strncpy(sptsf_cert.recv_inst,clr_total.payint_acc,4);//拷贝前四位
为了您的安全,请只打开来源可靠的网址

打开网站取消

来自: http://hi.baidu.com/wenleiworld/blog/item/175e072ad002aef0e6cd4033.html
分享到:
评论

相关推荐

    msdn 错误信息

    msdn 错误信息

    MSDN2005绿色便携版MSDN

    首先声明,这份资源是amo_xoo的毛哥.NET 2.0便携参考(绿色MSDN) 2.0 彻底版,但他那个分了9个包,下载起来很不方便,所以就引用过来,方便大家下载。 微软MSDN在线库虽然全,但有时不方便上网,而MSDN Library安装...

    msdn 上面的vb 多线程

    msdn 上面的vb 多线程

    MSDN 我告诉你 整站镜像完整包

    MSDN我告诉你 挂掉了 ,我这是整站备份包,使用说明压缩包里有,可以下载所有的以前站点的光盘镜像。

    MSDN绿色U盘版-14

     本绿色版依照MSDN August 2001 Edition制作,应该说这基本上是适合VC++6.0的最后一个版本了,后面版本的MSDN都是.NET平台的了。本绿色版包含了Windows SDK(MSDN 2001中的,含DirectX9),Windows DDK (2003 DDK...

    MSDN-library-vchelp.rar_MSDN library chm_MSDN-library_msdn_msdn

    vc++6.0 MSDN Library chm

    VC++ 6.0 msdn中文版

    中文版msdn,需然小了点,不过对入门都来说是不错的选择....

    [MSDN杂志] MSDN Magazine 2014年05月刊 英文版

    无论构建 Web 服务、集成旧数据存储,还是学习 .Net,MSDN Magazine 都可助您一臂之力; ☆ 出版信息:☆ [出版机构] Microsoft [出版日期] 2014年05月 [图书语言] 英语 [图书格式] PDF 格式"&gt;☆ 资源说明:☆ ...

    获取XP登陆密码,MSDN上的文章

    一个从MSDN上面看到的一篇介绍如何得到XP登陆密码的VC6程序,大家参考一下啊

    share msdn

    share msdn share msdn share msdn share msdn share msdn share msdn

    [MSDN杂志] MSDN Magazine 2017年01月刊

    作为面向开发人员的 MSDN 资源系列的必要组成部分,MSDN Magazine 可以为您每天遇到的实际问题提供解决方案。无论构建 Web 服务、集成旧数据存储,还是学习 .Net,MSDN Magazine 都可助您一臂之力; ☆ 出版信息 ☆...

    精简版的MSDN for VB6.0

    MSDN VB6精简版 ,去除了MSDN中VC。 VF以及其他部分,只保留了完整的VB帮助,强烈推荐! ========= 安装说明 ========= 1、执行setup.exe。 2、注册码已固化在安装程序里,不必输入了。^*^ 3、按照提示...

    MSDN2005绿色便携版

    首先声明,这份资源是amo_xoo的毛哥.NET 2.0便携参考(绿色MSDN) 2.0 彻底版,但他那个分了9个包,下载起来很不方便,所以就引用过来,方便大家下载。 微软MSDN在线库虽然全,但有时不方便上网,而MSDN Library安装...

    [MSDN].msdn_oct_2001

    [MSDN].msdn_oct_2001 适用于vc++6.0,最后一个版本。分成7个文件上传

    WINDOWS 编程 MSDN

    MSDN MSDN MSDN MSDN MSDN MSDN

    MSDN中文版

    MSDN中文版,还有一些windows32的API详解,是编程的必备参考资料。 MSDN中文版,还有一些windows32的API详解,是编程的必备参考资料。

    [MSDN杂志] MSDN Magazine 2017年04月刊

    作为面向开发人员的 MSDN 资源系列的必要组成部分,MSDN Magazine 可以为您每天遇到的实际问题提供解决方案。无论构建 Web 服务、集成旧数据存储,还是学习 .Net,MSDN Magazine 都可助您一臂之力; ☆ 出版信息 ☆...

    MSDN绿色U盘版-15

     本绿色版依照MSDN August 2001 Edition制作,应该说这基本上是适合VC++6.0的最后一个版本了,后面版本的MSDN都是.NET平台的了。本绿色版包含了Windows SDK(MSDN 2001中的,含DirectX9),Windows DDK (2003 DDK...

Global site tag (gtag.js) - Google Analytics