Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125215
  • 博文数量: 28
  • 博客积分: 727
  • 博客等级: 中士
  • 技术积分: 190
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-06 11:25
文章存档

2015年(1)

2013年(1)

2011年(26)

分类: C/C++

2011-04-25 10:57:33

#include "memory.h"

memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘\0’;例:char a[100];memset(a, '\0', sizeof(a)); 
memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。
memcpy进行内存的拷贝,与strcpy的不同在于strcpy只能拷贝字串,即遇到\0就结束拷贝,但是本函数不管遇到什么都会继续拷贝,直到达到了既定的内存个数。

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的指针。

函数原型:
          char * strcpy(char * des, const char * src)
    {
assert((des!=NULL)&&(src!=NULL));
char *add=des;
while((*des++=*src++)!='\0');
return add;
 }

memcpy 
 原型:extern void *memcpy(void *dest, void *src, unsigned int count);
 用法:#include
 功能:由src所指内存区域复制count个字节到dest所指内存区域。
 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。

函数原型:
void * memcpy(void * des, const void *src, int count)
{
assert((des!=NULL)&&(src!=NULL));
void * add=des;
while(count-->0)
*des++=*src++;
return add;
}

memset
 原型:extern void *memset(void *buffer, int c, int count);
 用法:#include
 功能:把buffer所指内存区域的前count个字节设置成字符c。
 说明:返回指向buffer的指针。

函数原型:
void *memset(void *buffer, int c, int count)
{
assert(buffer!=NULL);
void *xs = buffer;
while (count--)
*xs++ = c;
return buffer;
}

ASSERT()是干什么用的

  ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序: 
    ...... 
    ASSERT( n != 0); 
    k = 10/ n; 
    ...... 
    ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。 
    assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。 


system(”pause”);
系统的暂停程序,按任意键继续,屏幕会打印,“按任意键继续。。。。。” 省去了使用getchar();


strncpy函数:
功能:依然是字符串的拷贝,但是拷贝固定的字符个数,也需要受到\0的限制
函数原型:
char *strncpy(char * des, const char * src, int count)
{
assert((des!=NULL)&(src!=NULL));
char * add=des;
if(count<=strlen(src))
{
 while(count-->0)
*des++=*src++;
 for(int i=0;i<(sizeof(des)-count);i++)
* ++des='\0'
}
else if(count>=strlen(src)&&count<=strlen(des))
{
 int n=strlen(src);
 while(n-->0)
*des++=*src++;
for(int i=0;i<(strlen(des)-strlen(src));i++)
*++des='\0';
}
return add;
}
 

总结:strcpy 
如果源长>目标长,则将源长中等于目标长的字符拷贝到目标字符串 
如果源长<目标长,则源长全部拷贝到目标字符串,不包括'\0' 
strncpy 
如果目标长>指定长>源长,则将源长全部拷贝到目标长,自动加上'\0' 
如果指定长<源长,则将源长中按指定长度拷贝到目标字符串,不包括'\0' 
如果指定长>目标长,error happen! 
 
strncpy为strcpy的一个安全版本:
列入:
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结果一样! 
阅读(1944) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~