strcpy memcpy等相关函数实现

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(...)是运算符,在头文件中typedefunsigned 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不能超过最短字符串的长度,否则结果有可能是错误的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值