模拟实现strlen、strcpy、strcmp、strncmp等字符串函数

来源:互联网 发布:万达怎么了 知乎 编辑:程序博客网 时间:2024/05/22 13:13

1.模拟实现strlen

//三种方法实现#include <stdio.h>#include <windows.h>#include <assert.h>//递归int my_strlen1(const char *str){    assert(str);    if (*str == '\0')    {        return 0;    }    return 1 + my_strlen1(str + 1);}//非递归int my_strlen2(const char *str){    assert(str);    int count = 0;    char *p = str;    while (*p)    {        if (*p == '\0')        {            return 0;        }        else        {            p++;            count++;        }    }    return count;}int my_strlen3(const char *str){    char *p = str;    while (*p != '\0')    {        p++;    }    return p - str;       //指针-指针表示指针间跨越的个数}int main(){    char str[] = "abcdef";    printf("len1 = %d\n", my_strlen1(str));    printf("len2 = %d\n", my_strlen2(str));    printf("len3 = %d\n", my_strlen3(str));    system("pause");    return 0;}

结果如下:

结果

2.模拟实现strcpy、strcat

#include <stdio.h>#include <windows.h>#include <assert.h>char* my_strcat(char* dest, const char* src){    char *ret = dest;    assert(dest);    assert(src);    while (*dest)    {        dest++;        //判断目标字符串是否到'\0'    }    while (*dest++ = *src++)   //将源字符串拷贝给目标字符串    {        ;    }    return ret;}char* my_strcpy(char* dest, const char* src){    char *ret = dest;    assert(dest);    assert(src);    while (*dest++ = *src++)    {        ;    }    return ret;}int main(){    char arr[20] = { 0 };    char *p = arr;    my_strcpy(p, "Hello");    printf("%s\n", p);    my_strcat(p, " world!");    printf("%s\n", p);    system("pause");    return 0;}

结果如下:

结果

3.模拟实现strcmp

#include <stdio.h>#include <windows.h>#include <assert.h>int my_strcmp(const char *str1, const char *str2){    assert(str1);    assert(str2);    while (*str1 != '\0' && *str2 != '\0')    {        if (*str1 == *str2)        {            str1++, str2++;        }        else if (*str1 > *str2)        {            return 1;        }        else        {            return -1;        }    }    if (*str1 != '\0')      //如果str1长说明str1比str2大    {         return 1;           }    else if (*str2 != '\0')    //如果str2长说明str2比str1大    {        return -1;    }    else    {        return 0;    }}int main(){    char str1[] = "abcdeg";    char str2[] = "abcdef";    int ret = my_strcmp(str1, str2);    if (ret > 0)    {        printf("%s is greater than %s\n", str1, str2);    }    else if (ret == 0)    {        printf("%s is the same as %s\n", str1, str2);    }    else    {        printf("%s is less than %s\n", str1, str2);    }    system("pause");    return 0;}

结果如下:

结果

4.模拟实现strncpy、strncat

#include <stdio.h>#include <windows.h>#include <assert.h>char* my_strncat(char* dest, const char* src,int num){    char *ret = dest;    assert(dest);    assert(src);    while (*dest)    {        dest++;    }    while (num && (*dest++ = *src++))       //拷贝num长的字符串到目标字符串中    {        num--;    }    *dest++ = '\0';      //将最后的'\0'拷入字符串中    return ret;}char* my_strncpy(char* dest, const char* src,int num){    char *ret = dest;    assert(dest);    assert(src);    while (num && (*dest++ = *src++))       //拷贝num长的字符串到目标字符串中    {        num--;    }     if (num > 0)    {        while (--num)        {            *dest++ = '\0';     //若num比源字符串长,那么多出的要拷贝字符用'\0'代替        }    }    return ret;}int main(){    char arr[20] = { 0 };    char *p = arr;    my_strncpy(p, "Hellol",5);    printf("%s\n", p);    my_strncat(p, " world!!",7);    printf("%s\n", p);    system("pause");    return 0;}

结果如下:

结果

5.模拟实现strncmp

#include <stdio.h>#include <windows.h>#include <assert.h>int my_srtncmp(const char *str1, const char *str2, size_t num){    assert(str1);    assert(str2);    while (num && (*str1 == *str2))      //比较str1和str2中前num个字符的大小    {        str1++;        str2++;        num--;    }    if (num > 0)    {        return *str1 - *str2;       //将所有字符比较完后证明两字符串相等    }    else    {        return *(str1 - 1) - *(str2 - 1);     //当遇到不相等时,指向的是不相等的字符    }}int main(){    char str[][5] = { "rode", "ride", "root" };    int i = 0;    for (; i < 3; i++)    {        if (my_srtncmp(str[i], "rore", 2) == 0)        {            printf("result [%d] :%s\n", i, str[i]);        }    }    system("pause");    return 0;}

结果如下:

结果

6.模拟实现strchr(查找字符在字符串中第一次出现的位置)

#include <stdio.h> #include <windows.h>#include <assert.h>char * my_strchr(const char * str, int ch){    assert(str);    while (*str && (*str != (char)ch))     //判断对应字符是否是所找字符    {        str++;    }    if (*str == (char)ch)    {        return (char *)str;      //若找到了则返回它的地址    }    return NULL;}int main(){    char str[] = "This is a sample string";    char *p = my_strchr(str, 's');    if (p != NULL)    {        printf("find the char at : %d\n", p - str + 1);    //找到目标字符出现的位置    }    else    {        printf("could not find the char\n");    }    system("pause");    return 0;}

结果如下:

结果

7.模拟实现strstr(查找子串)

#include <stdio.h>#include <windows.h>#include <assert.h>char *my_strstr(const char *dest, const char *src) {    assert(dest);    assert(src);    char *start = (char *)dest;    char *substart = (char *)src;    char *ret = (char *)dest;    //保存dest首地址    while (*ret)    {        start = ret;        while (*start && *substart && (*start == *substart))        {            start++;            substart++;        }        if (*substart == '\0')        {            return ret;        }        substart = (char *)src;        ret++;         //得到原起始位置的下一个位置    }    return NULL;}int main(){    char str[20] = "abcdefghijk";    char *p = str;    printf("%s\n",my_strstr(p, "defg"));    system("pause");    return 0;}

结果如下:

结果

阅读全文
0 0
原创粉丝点击