您的位置:首页 > 其它

strcpy memcpy等相关函数实现

2013-05-12 11:37 330 查看
1.strcpy memcpy

strcpy和memcpy都是标准C库函数,它们有下面的特点。

strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。

已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);

memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。

实现:

char* my_strcpy(char* dst, const char* src)

{

      char* tmp = dst;

      

      assert(NULL != dst && NULL != src);

      while((*tmp++ = *src++) != '\0');            

      

      return dst;

}

void* my_memcpy(void* dst, const void* src, int len)

{

      assert(NULL != dst && NULL != src);

      char* tdst = (char *)dst;

      char* tsrc = (char *)src;

      

      while(len-- > 0) *tdst++ = *tsrc++;

      return dst;

}

2.sizeof strlen

sizeof(...)是运算符,在头文件中typedef为unsigned
int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。

它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。

strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。

它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到

遇到结束符NULL。返回的长度大小不包括NULL.

实现:

int my_strlen(const char* str)

{
    assert(NULL != str);

    char* tmp = str;

    while(*(++tmp) != '\0');    

   
return tmp - str;    

}

3.strcmp memcmp

对于memcmp(),如果两个字符串相同而且count大于字符串长度的话,memcmp不会在\0处停下来,会继续比较\0后面的内存单元,直到_res不为零或者达到count次数。      

 对于strncmp(),由于((__res   =   *cs   -   *ct++)   !=   0   ||   !*cs++)的存在,比较必定会在最短的字符串的末尾停下来,即使count还未为零。具体的例子:      

  char   a1[]="ABCD";   

  char   a2[]="ABCD";       

 对于memcmp(a1,a2,10),memcmp在两个字符串的\0之后继续比较   

 对于strncmp(a1,a2,10),strncmp在两个字符串的末尾停下,不再继续比较。       

 所以,如果想使用memcmp比较字符串,要保证count不能超过最短字符串的长度,否则结果有可能是错误的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息