从这篇文章可以看出有些错误,由此可以看出,还是看msdn要好的多,这是我的经验
2010-07-04 22:20
369 查看
建议大家多看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
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
相关文章推荐
- 这是我转贴的strcpy函数与strncpy函数的比较,其中有些错误,建议大家还是看msdn,要好的多
- 技术之美[程序人生]一篇IT企业工资表,虽然有些不够准确,但还是可以进行参考的
- 这几天网络问题 blog的文章 有些不可以贴上来
- 博客里有些文章写的不错,可以看一看
- 防火墙技术专题[转贴,文章虽老,但技术上还是有可以学习的]
- 在visual c++上出现编译错误时而又无助无解的时候。。还是得看MSDN
- 网上看到的星际制图技巧,有些反作弊的方法还是可以借鉴的
- 对上一篇文章: java求助的一点改进,但是还是存在一个很严重的错误,继续求助????
- 百度空间:飘动的天空 有些看到的好文章收录在此处就不拷过来了 有兴趣的朋友可以看下
- 在一个博客上摘抄了几个片断,感觉从中还是可以汲取一些经验的
- VC6.0 msdn 文章中关于更改m_pszAppName的错误
- 用什么方法可以在业务批量操作的时候保持原子性?例如删除多条文章,但是在中 间有一条被删除了,假设出现了错误,如何让整个操作回滚,并定位错误信息?
- MEF: MSDN 杂志上的文章(15) 拒绝【多个导出,但只用一个导入,会拒绝,但还是稳定的组合】
- 收藏文章 写的很好 可惜有些还是看看不懂额。。。
- 有些朋友说,这里多放一些技术性的文章比较好,资源类的可以放,少放些
- 不少程序员都会碰到的三个面试题:如果你只想获取一些面试准备经验,那么你可以直接跳到文章的最后部分
- qml的一个文章----可以看出状态、动画的使用
- 奇怪问题绑定和监听127.0.0.1把网络禁用还是可以成功。当网络断开时accept不会返回错误。网络再次连上时还能正常工作。
- 通过博客文章中人称的变换,可以看出文章的密级。。。
- 测试您的Windows CE设备的界面性能——可以看出你的是RGB 565 还是RGB888