注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风雨启示录

欢迎光临我的网店优优我心:http://uumyheart.taobao.com

 
 
 

日志

 
 

C语言:STRCAT,STRCPY,MEMSET,MEMCPY函数及其区别  

2010-09-30 21:22:14|  分类: C语言学习笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1. strcat()函数
 
不调用C++/C 的字符串库函数,请编写函数 strcat
VC源码:
char * __cdecl strcat (char * dst, const char * src)
{
char * cp = dst;
while( *cp )
cp++; /* find end of dst */
while( *cp++ = *src++ ) ; /* Copy src to end of dst */
return( dst ); /* return dst */
}
 
strcat()接受两个字符串参数。将第二个字符串的一份拷贝添加到第一个字符串的结尾,从而使第一个字符串成为一个新的组合字符串,第二个字符串不改变。
 
2. memset()函数
 
void *memset(void *s, char ch, unsigned n)
 
将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作
 
你刚分配的内存空间,或者是被你用过的内存空间里面的数据是不固定的
为了避免这些无用的数据给自己的程序带来影响,可以用memset把这些内存里面的数据置成某个数值
一般情况下是置0;
 
/* MEMSET.C: This program uses memset to
* set the first four bytes of buffer to "*".
*/
 
#include <memory.h>
#include <stdio.h>
 
void main( void )
{
char buffer[] = "This is a test of the memset function";
 
printf( "Before: %s\n", buffer );
memset( buffer, '*', 4 );
printf( "After: %s\n", buffer );
}
 
输出:
 
Before: This is a test of the memset function
After: **** is a test of the memset function
 
3. strcpy()函数
 
1.strcpy的实现代码
char*strcpy(char*strDest, const char*strSrc)
{
  assert((strDest != NULL) && (strSrc != NULL));
 
 char *address = strDest;
 while ((*strDest++ = *strSrc++) !='\0' '')
  continue;
 
 return address;
}
 
2.memcpy的实现代码
 
void *memcpy(void *pvTo, const void *pvFrom, size_t size)
{
 assert((pvTo != NULL) && (pvFrom != NULL)); // 使用断言
 byte *pbTo = (byte *) pvTo; // 防止改变pvTo 的地址
 byte *pbFrom = (byte *) pvFrom; // 防止改变pvFrom 的地址
 
 while(size -- > 0 )
  *pbTo ++ = *pbFrom ++ ;
 
 return pvTo;
 
}
 
 strcpy只是复制字符串,但不限制复制的数量。很容易造成缓冲溢出。  
  strncpy要安全一些。  
  memcpy也可以用来在内存中复制数据,由于字符串是以零结尾的,所以对于在数据中包含零的数据只能用memcpy。  
  性能上它们不一定有多大差别。  
 
 
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/davidgchen/archive/2009/03/27/4028811.aspx

 
memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ '或‘\0';例:char a[100];memset(a, '\0', sizeof(a));
memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。
strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0'之前)是否超过50位,如超过,则会造成b的内存地址溢出。
strcpy
原型:extern char *strcpy(char *dest,char *src);
用法:#include
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
memcpy
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#include
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
Memset
原型:extern void *memset(void *buffer, char c, int count);
用法:#include
功能:把buffer所指内存区域的前count个字节设置成字符c。
说明:返回指向buffer的指针。
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yuwei19840916/archive/2008/11/19/3326057.aspx
  评论这张
 
阅读(1270)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017