常用C库函数的实现

手撕代码
一向是笔试面试必不可少的环节
算法、C库、操作系统

实现C语言库函数我们在课上也经常会给大家写,但是都不够全面。所以今天就给大家总结了一下。

常见C库函数的实现代码奉上

01
memcpy

函数原型

void *memcpy(void *dest, const void *src, size_t n);

返回值

返回指向dest的指针。

void *memcpy(void *dest, const void *src, size_t n)
{
    if (NULL == dest || NULL == src)
    {
        return NULL;
    }char *dest_t = (char *)dest;                  //转换成字符型一个个复制拷贝,由于函数拷贝的过程是一个字节一个字节的拷贝的,所以实际操作的时候要把void*强制转化为char*,
    char *src_f = (char *)src;                    //这样在指针加的时候才会保证每次加一个字节while (n-- > 0)
    {
        *(dest_t++) = *(src_f++);
    }return dest;                                //void* 一定要返回一个值(指针),这个和void不太一样!函数返回指向dest的指针
}

02
strcpy

函数原型

char *strcpy(char *dest, const char *src);

函数返回值

返回指向字符串的指针dest。

char* strcpy(char *dest, const char *src)
{
    if (dest == NULL || src == NULL)
        return NULL;char *res = dest;     //保存原始dst的首地址
  
    while ((*dest++ = *src++) != '\0');
    
    return res;
}

03
strcat

函数原型

char *strcat(char *dest, const char *src);

函数返回值

返回指向结果字符串的指针dest。

char *strcat(char *dest, const char *src)
{
    if (NULL == dest || NULL == src)
        return NULL;
        
    char *head = dest;//dest指针移动到字符串末尾
    while (*dest != '\0')while ((*dest++ = *src++) != '\0');return head;
} 

04
strcmp

函数原型

int strcmp(const char *s1, const char *s2);

函数返回值

如果s1小于s2,返回值小于0;如果s1等于s2,返回值等于0;如果s1大于s2,返回值大于0。

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

05
strlen

函数原型

size_t strlen(const char *s);

函数返回值

返回字符串的长度(字节)。

size_t strlen(const char *str)
{
    assert(str);int length = 0;
    while(*str++ != '\0')
    {
        length++;
    }return length;
}

06
strstr

函数原型

char *strstr(const char *haystack, const char *needle);

函数返回值

返回子串的起始地址,如果子串不存在,返回空。

char *strstr(const char *haystack, const char *needle)
{
    if (haystack == NULL || needle == NULL)
        return NULL;char *temp = haystack;
    char *res = needle;
    
    while (*haystack != '\0') 
    {
        temp = haystack;
        res = needle;while (*temp == *res)
        {
            temp++;
            res++;
        }        
        if (*res == '\0')
            return haystack;
            
        haystack++;
    }return NULL;
}

07
memset

函数原型

void *memset(void *s, int c, size_t n);

函数返回值

返回内存的地址。

void *memset(void *s, int c, size_t n)
{
    void *ret = s;
    
    while(n--)
    {
        *(char *)s = (char)c;
        s = (char *)s + 1; //移动一个字节
    }return ret; 
}

08
atoi

函数原型

int atoi(const char *nptr);

函数返回值

转换后的数值。

int isspace(int x)  
{  
    if (x == ' ' || x == '\t' || x == '\n' || x =='\f' || x =='\b' || x == '\r')  
        return 1;  
    else   
        return 0;  
}int isdigit(int x)  
{  
    if (x <= '9' && x >= '0')           
        return 1;   
    else   
        return 0;  
}

int atoi(const char *nptr)  
{  
    int c;              /*当前字符*/  
    int total;          /*总计字节数*/  
    int sign;           /*正数or负数*/     
  
    /*跳过开头的空格*/  
    while (isspace((int)(unsigned char)*nptr))  
        ++nptr;  
  
    c = (int)(unsigned char)*nptr++;  
    sign = c;           /*保存符号*/  
    if (c == '-' || c == '+')  
        c = (int)(unsigned char)*nptr++;    /* skip sign */  
   
    total = 0;  
    while (isdigit(c)) 
    {  
        total = 10 * total + (c - '0');     /*求和*/  
        c = (int)(unsigned char)*nptr++;    /*获取下一个字符*/  
    }if (sign == '-')  
        return -total;  
    else  
        return total;  
}

09
strchr

函数原型

char *strchr(const char *s, int c);

函数返回值

返回匹配到的字符的地址,如果不存在返回空。

char *strchr(const char *s, int c) 
{
    if (NULL == s)
    {
        return NULL;
    }while (*s != '\0') 
    {
        if (*dst == (char)c) 
        {
            return dst;
        }
        
        s++;
    }return NULL;
}

10
strdup

函数原型

char *strdup(const char *s);

函数返回值

返回被复制字符串的地址。

char *my_strdup(char *src)
{
    if(NULL == src)
    {
        return NULL; 
    }
    char *p_src = NULL;
    p_src = src ;
    int count = 0 ;
    while(*p_src != '\0')
    {
         count++;
         p_src++;}
    char * new_addr  = (char *)malloc(sizeof(char)*(count+1));
    p_src = src;
        while(*p_src  != '\0')
    {
        *new_addr++ = *p_src++;}
    *new_addr = '\0';
    return (new_addr -(count));
}

更多精彩视频、文章,请关注微信公众号 学益得智能硬件

在这里插入图片描述

发布了10 篇原创文章 · 获赞 21 · 访问量 1323

猜你喜欢

转载自blog.csdn.net/xiaopengX6/article/details/104424523