str系列库函数的模拟实现

1、模拟实现strlen :字符串求长度
思路:字符串都有结束标志\0,只要遍历这个字符串,知道遇到\0结束,就能轻松的获得字符串的长度了
(1)不创建计数器(递归)

int my_strlen1(const char* str)
{
    if ('\0' == *str)
        return 0;
    else
        return 1 + my_strlen1(str + 1);
}

(2)创建计数器(非递归)

int my_strlen2(const char* str)
{
    int count = 0;
    while (*str)
    {
        count++ ;
        str++;
    }
    return count;
}

(3)指针

int my_strlen3(char* str)
{
    char* p = str;
    while ('\0' != *p)
        p++;
    return p - str;
}

int main()
{
    char* str = "abcdefg";
    printf("长度为:%d", my_strlen1(str));
    printf("长度为:%d", my_strlen2(str));
    printf("长度为:%d", my_strlen3(str));
    getchar();
    return 0;
}

2、 模拟实现strcpy :字符串拷贝
思路:将src字符串复制到dst上,由于dst参数是被修改的,所以他必须是一个字符数组或者是一个指向动态分配内存的数组的指针
不能使用字符串常量。新的字符串意\结尾,所以老字符串剩余的几个字符将会被有效地删除

char* my_strcpy(char* dest,const char* src)
{
    // 先断言一把
    assert(NULL != dest);
    assert(src);

    char* ret = dest;   //先让ret保存dest的起始位置

    //将src中的值一次拷贝到dst之中
    //先进行了复制再进行了++,当赋值到终结符‘\0’时,不符合while的判断条件,退出循环
    //而此时已经将所有的内容复复制到字符数组中了
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}

int main()
{
    char str1[] = "hhhhhhhhhhhhhhhhhhhhhhhhh";  // 这里dest也就是str1必须给够空间
    char* str2 = "hello world";
    printf("%s\n", my_strcpy(str1, str2));
    getchar();
    return 0;
}

3、模拟实现strncpy
《char *strncpy(char *dest, const char *src, int n)》
把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest。
strncpy是将一个字符串的n个字符复制到另一个字符串中,模拟实现strncpy是要注意到字符串的”\0”,
因为是复制n个字符所以并不知道是否将”\0”复制到目标字符串中,所以要在程序中加上给目标字符串附上”\0”

char* my_strncpy(char* dest, const char*src, int n)
{
    assert(dest);
    assert(src);
    char* ret = dest;

    while (n--)
    {
        *dest++ = *src++;
    }
    if (*(dest - 1) != '\0')//判断是否已经将‘\0’复制到目标字符串中
        *dest = '\0';      //若没有则给目标字符串最后添加‘\0’ 
    return ret;

}
int main()
{
    char str1[10];
    char* str2 = "hello";
    printf("%s\n", my_strncpy(str1, str2, 5));
    getchar();
    return 0;
}

4、 模拟实现strcat:字符串追加
//思想:找到目的字符串的末尾将源字符串的一份拷贝添加到这个位置。

char* my_strcat(char* dest, const char* src)
{
    // 断言一把
    assert(dest);
    assert(src);

    char* ret = dest;   //先让ret保存dst的起始位置
    // 先找到目的串的末尾
    while (*dest)
    {
        *dest++;
    }
    // 追加
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    char str1[12] = "hello";
    const char* str2 = "world";
    printf("%s\n", my_strcat(str1, str2));
    getchar();
    return 0;
}

5、模拟实现strstr:strstr(str1,str2)判断str2是否是str1的子串

char* my_strstr(const char* dest, const char* src)
{
    assert(dest);
    assert(src);

    char* start = (char*)dest;//在这里需要强制类型转换成char*
    char* substart = (char*)src;
    char* cp = (char*)dest;//cp就是用来保存首地址的

    while (*cp)
    {
        start = cp;
        while (*start != '\0' && *substart != '\0' && *start == *substart)
        {
            start++;
            substart++;
        }
        if (*substart == '\0')
        {
            return cp;
        }
        substart = (char*)src;
        cp++;//cp++可以得到原起始位置的下一个位置
    }
    return NULL;
}

int main()
{
    const char* str1 = "hello world";
    const char* str2 = "world";
    printf("%s\n", my_strstr(str1, str2));
    getchar();
    return 0;
}

6、模拟实现strcmp:字符串比较
//思想:比较两个字符串就是对两个字符串的字符逐个进行比较,知道发现不匹配位置。
//由于strcmp不改变任何一个参数,所以不存在溢出字符数组的缺点
//但是strcmp的参数必须要有结束标志符结尾,否则strcmp就有可能对参数后面的内容进行比较,这样得出来的结果没什么意义。

//str1>str2,返回1
//str1=str2,返回0
//str1<str2,返回-1
int my_strcmp(char* dest,char* src)
{

    int ret = 0;
    while (!(ret = *(unsigned char*)dest - *(unsigned char*)src) && dest)
    {
        ++dest;
        ++src;
    }
    if (ret > 0)
        return 1;
    else if (ret < 0)
        return -1;
    return ret;
}

int main()
{
    char str1[] = "world";
    char str2[] = "world";
    printf("%d", my_strcmp(str1, str2));
    getchar();
    return 0;
}

7、 模拟实现strncmp

int my_strncmp(const char* str1, const char* str2, int n)
{
    assert(str1);
    assert(str2);
    while (n--)
    {
        if (*str1 == *str2)
        {
            str1++;
            str2++;
        }
        else
        {
            if ((*str1 - *str2) < 0)
                return -1;
            else
                return 1;
        }
    }
    return 0;
}

int main()
{
    char str1[] = "world";
    char str2[] = "world";
    printf("%d", my_strncmp(str1, str2,2));
    getchar();
    return 0;
}

当初偷的懒,欠的债,都是要还的啊!!!
加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值