模拟实现C库函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ling_hun_pang_zi/article/details/81903527

模拟实现C库函数

目录

1、strlen函数

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。

函数原型

size_t strlen(const char *string);

模拟实现

//计数器的方法
int mystrlen(const char *str)
{
     assert(str != NULL);
     int count = 0;
     while (*str != '\0')
     {
           count++;
           str++;
     }
     return count;
}
//指针减指针
int mystrlen(const char *str)
{
     const char *p = str;
     while (*p != '\0')
     {
           p++;
     }
     return p - str;
}
//递归的方法
int mystrlen(const char *str)
{
     if (*str == '\0')
           return 0;
     return 1 + mystrlen(str + 1);
}
2、strcpy函数

strcpy把从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。

函数原型:

char *strcpy(char *strDestination, const char *strSource);

模拟实现:

//容易理解的
char* mystrcpy(char* dest, const char* src)
{
     assert(dest != NULL);
     assert(src != NULL);
     while (*src != '\0')
     {
           *dest = *src;
           dest++;
           src++;
     }
     *dest = *src;
     return dest;
} 

//简洁版
char* mystrcpy(char* dest, const char* src)
{
     assert(dest != NULL);
     assert(src != NULL);
     while (*dest++ = *src++)
     {
           ;
     }
     return dest;
}
3、strncpy函数

把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest。

函数原型:

char *strncpy(char *strDest, const char *strSource, size_t count);

模拟实现:

char* mystrncpy(char*dest, const char*src, int n)
{
     assert(dest);
     assert(src);
     char *p = dest;
     while (n--)
     {
           *dest++ = *src++;
     }
     *dest = '\0';
     return p;
}
4、strcmp函数

两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。

函数原型:

int strcmp(const char *string1, const char *string2);

模拟实现:

int mystrcmp(const char *str1, const char *str2)
{
     assert(str1);
     assert(str2);
     while (*str1 == *str2)
     {
           if (*str1 == '\0')
                return 0;
           str1++;
           str2++;
     }
     if (*str1 > *str2)
           return 1;
     else
           return -1;
}
5、strcat函数

把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。

说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

函数原型:

char *strcat(char *strDestination, const char *strSource);

模拟实现:

char *mytstrcat(char *dest, const char *src)
{
     assert(dest);
     assert(src);
     char *res = dest;
     while (*res)
     {
           res++;
     }
     while (*src)
     {
           *res++ = *src++;
     }
     *res= '\0';
     return dest;
}
6、strstr函数

strstr函数就是为了判断你需要查找的字符串在原来的字符串中有没有,如果有,输出这个字符串的位置,没有,输出空。

函数原型:

char *strstr(const char *string, const char *strCharSet);

模拟实现:

char *mystrstr(const char *str, const char *substr)
{
     char *start = (char*)str;
     char *substart = (char*)substr;
     char *cp = (char*)str;//cp用来保存首地址
     while (*cp)
     {
           start = cp;
           substart = (char*)substr;
           while (*start != '\0' &&*substart != '\0' && *start == *substart)
           {
                start++;
                substart++;
           }
           if (*substart == '\0')
                return cp; 
           cp++;//得到起始位置的下一个位置
     }
     return NULL;
}
7、memcpy函数

从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

1.source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针.

2.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

注意:source和destin都不一定是数组,任意的可读写的空间均可。

函数原型:

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

模拟实现:

void *mymemcpy(void *dest, const void *src, size_t count)
{
     char *str1 = (char*)dest;
     char *str2 = (char*)src;
     void *ret = dest;
     while (count--)
     {
           *str1++ = *str2++;
     }
     return ret;
}
8、memmove函数

memmove用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

函数原型:

void *memmove(void *dest, const void *src, size_t count);

模拟实现:

void *mymemmove(void *dest, const void *src, size_t count)
{
    assert(dest);
    assert(src);

    char *str1 = (char*)dest;
    char *str2 = (char*)src;
    void *ret = dest;

    if (str1 > str2)//反向拷贝
    {
        while (count--)
        {
            *(str1 + count) = *(str2 + count);
        }
    }
    else
    {
        while (count--)
        {
            *str1++ = *str2++;
        }
    }
    return ret;
}

猜你喜欢

转载自blog.csdn.net/ling_hun_pang_zi/article/details/81903527
今日推荐