zoukankan      html  css  js  c++  java
  • 常见C语言库函数源码

    memcpy和memmove功能基本上差不多,但是当源串和目标串有Overlap时,memmove可以正确处理,memcpy则不行。

    void * __cdecl memcpy (void * dst, const void * src, size_t count)
    {
    void * ret = dst;


    while (count--) {
    *(char *)dst = *(char *)src;
    dst
    = (char *)dst + 1;
    src
    = (char *)src + 1;
    }

    return(ret);
    }

    void * __cdecl memmove (void * dst, const void * src, size_t count)
    {
    void * ret = dst;

    if (dst <= src || (char *)dst >= ((char *)src + count)) {

    while (count--) {
    *(char *)dst = *(char *)src;
    dst
    = (char *)dst + 1;
    src
    = (char *)src + 1;
    }
    }
    else {

    dst
    = (char *)dst + count - 1;
    src
    = (char *)src + count - 1;

    while (count--) {
    *(char *)dst = *(char *)src;
    dst
    = (char *)dst - 1;
    src
    = (char *)src - 1;
    }
    }

    return(ret);
    }

      

    strcpy

    char *strcpy(char *strDest, const char *strScr)
    {
      char *address=strDest;
      assert((strDest != NULL) && (strScr != NULL));
      while(*strScr) //是while(*strScr != ’\0’)的简化形式;
      {
        *strDest++ = *strScr++;
      }
      *strDest = '\0'; //当strScr字符串长度小于原strDest字符串长度
      return address; //时,如果没有改语句,就会出错了。

    }

      

    strcmp

    int strcmp (const char *str1,const char *str2)
    {
    int len = 0;
    assert((str1
    != '\0') && (str2 != '\0'));
    while(*str1 && *str2 && (*str1 == *str2))
    {
    str1
    ++;
    str2
    ++;
    }
    return *str1-*str2;
    }

     

    strcat

    char *strcat(char *strDest, const char strScr) //将源字符串加const,表明其为输入参数
    {
    char * address = strDest; //该语句若放在assert之后,编译出错

    assert((strDest
    != NULL) && (strScr != NULL)); //对源地址和目的地址加非0断言

    while(*strDest) //是while(*strDest!=’\0’)的简化形式
    {
    //若使用while(*strDest++),则会出错,因为++是不受循环
    strDest++; //约束的。所以要在循环体内++;因为要是*strDest最后指
    } //向该字符串的结束标志’\0’。
    while(*strDest++ = *strScr++) //是while((*strDest++ = *strScr++)!=’\0’)的简化形式
    {
    NULL;
    //该循环条件内可以用++,
    } //此处可以加语句*strDest=’\0’;
    return address; //为了实现链式操作,将目的地址返回

    }

      

    atoi

    int atoi(const char *str)
    {
    int value=0;
    bool b_plus=true; //判断符号

    switch(*str) //过滤符号

    {
    case '+':
    str
    ++;
    break;
    case '-':
    b_plus
    =false;
    str
    ++;
    break;
    default:
    break;
    }

    while('\0' != *str)
    {
    value
    = (value*10)+(*str-'0');
    str
    ++;
    }
    if(!b_plus)
    value
    =-value;
    return value;
    }

      

    memset

    void* memset(void* dest, int value, size_t num) 
    {
    assert(dest
    != NULL);
    unsigned
    char* p_dest = (unsigned char*)dest;
    while(num-- > 0)
    *p_dest++ = (unsigned char)value;
    return dest;
    }

      

     

      



  • 相关阅读:
    狄慧201771010104《面向对象程序设计(java)》第十六周学习总结
    狄慧201771010104《面向对象程序设计(java)》第十五周学习总结
    狄慧201771010104《面向对象程序设计(java)》第十四周学习总结
    201771030122-王瑞梅 实验二 个人项目—《西北师范大学学生疫情上报系统》项目报告
    201771030122-王瑞梅 实验一 软件工程准备—<初读《构建之法--现代软件工程》>
    软件工程学习总结
    团队项目在GitHub合作开发管理流程
    2020 软件工程—— 中期获“衣”有感
    201771010131-王之泰 实验四 软件项目案例分析
    数据库连接和导出excal
  • 原文地址:https://www.cnblogs.com/DanielZheng/p/2144624.html
Copyright © 2011-2022 走看看