• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

用c语言模拟实现常用字符串函数

武飞扬头像
蛋超饭不要加蛋
帮助1

目录

一.常用字符串函数介绍

1.strlen

2. strcpy

3.strcmp

4.strcat

5.strstr

二.模拟实现常用字符串函数

         1.strlen

2.strcpy

3.strcmp

4.strcat

5.strstr


一.常用字符串函数介绍

1.strlen

        字符串strlen是用来求字符串长度的,我们可以打开cpp网站查看有关信息

学新通

        该函数用来求字符串长度,求的是‘\0’之前字符的个数,函数参数为字符指针,因为该函数不需要修改字符串的值,故为了保护字符串被意外修改,设置为只读,所以在参数字符指针用const修饰,返回值即为字符串的长度,

        下面以经典helloworld字符串为例:

学新通

 输出结果:

学新通

字符串arr1为“helloworld”,一个10个字符,该字符串长度则为10,输出结果正确

2. strcpy

        字符串函数strcpy是用来拷贝字符串的,即将一个字符串的内容拷贝到另一个字符串中,而且会将该字符的'\0'也拷贝到另一个字符串中,我们打开cpp网站查看该函数的有关信息

学新通

         该函数的参数为两个字符指针,一个指向目标字符串,一个指向源字符串,由于只需要修改目标字符串,故用const修饰源字符串以防止误修改,函数返回值是目标字符串的首地址

下面以经典helloworld字符串为例:

学新通

  输出结果:

学新通

         可以看到我们将arr2中的helloworld成功地拷贝到了arr1中,但特别值得注意的是,当目标字符串空间不够时,强行拷贝比空间更大的字符串,虽然也可以输出结果,但毕竟是越界访问,会引发一些不可估计的问题,如将本例的arr1大小由10改为5:

学新通

 学新通

可以看到程序运行后,虽然正常地打印出了结果,但是程序出错了

3.strcmp

        字符串函数strcmp函数是用来比较两个字符串大小的,但是并不是比较两个字符串的大小,而是比较字符串的内容,如果第一个字符串小于第二个字符串,则返回一个小于0的值,大于则返回一个大于0的值,等于则返回0,如“hello”和“hellz”,前面的字符都相等,‘o’小于‘z’,故"hello"小于“hellz”,如“hellx”和"hella",前面的字符都相等,'x'大于'a',所以“hellx”大于“hella”

        打开cpp网站查看该函数的相关信息

学新通

        该函数的参数为两个字符指针,由于比较不需要修改字符串,所以两个参数都用const修饰以防误修改 返回值为int型,比较的结果为小于则为小于0的值,大于则为大于0的值,等于则为0

下面以经典的helloworld字符串为例

学新通

输出结果:

学新通 arr1小于arr2,故输出的结果为-1,arr3大于arr4,故输出的结果为1,arr5等于arr6,故输出的结果为0

4.strcat

        字符串函数strcat是用来连接两个字符串的,即将源字符串连接到目标字符串后面,连接的步骤是先找到目标字符串的末尾‘\0’,然后再进行拷贝,所以与strcpy的区别就在于要从目标字符串的末尾开始拷贝

        打开cpp网站查看该函数的相关信息:

学新通

         该函数的参数为两个字符指针,由于源字符串不需要修改,故加上const修饰以防误修改,返回值为连接后的字符串的地址,即目标字符串的地址

        下面以经典的helloworld字符串为例:

学新通

 输出结果

学新通

        可以看到我们成功地将arr2的“world”连接到arr1的“hello”中,于是arr1便变成了“helloworld”,与拷贝函数类似,特别值得注意的是,目标字符串要有足够大的空间,否则强行连接的话会出现一些未知的错误

        我们将上例的arr1的大小改为8:

学新通

 输出结果:

学新通

         可以看到虽然正常输出了,但是程序报错了

5.strstr

        字符串函数strstr是查找函数,在字符串中查找子串并返回子串在字符串第一次出现的地址,如果找不到子串则返回NULL

        打开cpp网站查看该函数的相关信息

学新通

        该函数的参数为两个字符指针。由于查找并不需要修改两个字符串的内容,所以两个字符指针都用const修饰,返回值为子串在字符串中第一次出现的地址

下面以经典的helloworld字符串为例:

学新通

 输出结果:

学新通

        可以看到“llo”可以在“helloworld”中找到,并返回指向“llo”’的地址,将改地址用%s打印,则从llo开始打印 ,即为lloworld

二.模拟实现常用字符串函数

1.strlen

       my_strlen模拟实现库函数strlen。参数为const char *,返回值为int型,即为字符串的长度,利用遍历字符串的方法,直到‘\0’结束遍历

  1.  
    #define _CRT_SECURE_NO_WARNINGS
  2.  
    #include<stdio.h>
  3.  
    #include<string.h>
  4.  
    int my_strlen(const char* str)
  5.  
    {
  6.  
    int len = 0;//定义长度,初始化为0
  7.  
    while (*str != '\0')//从头开始遍历字符串,直到'\0'结束
  8.  
    {
  9.  
    len ;
  10.  
    str ;
  11.  
    }
  12.  
    return len;//返回字符串的长度
  13.  
    }
  14.  
    int main()
  15.  
    {
  16.  
    char arr1[] = "helloworld";
  17.  
    int ret = my_strlen(arr1);
  18.  
    printf("%d", ret);
  19.  
    return 0;
  20.  
    }

   

2.strcpy

        利用my_strcpy模拟实现库函数strcpy,依次赋值,直到源字符串遍历到'\0"结束赋值,并返回预留的目标字符串的地址

  1.  
    #define _CRT_SECURE_NO_WARNINGS
  2.  
    #include<stdio.h>
  3.  
    #include<string.h>
  4.  
    char* my_strcpy(char* str1, const char* str2)
  5.  
    {
  6.  
    char* p = str1; //定义一个p指针保存str1,以便函数结束时返回
  7.  
    while (*str1 = *str2)//依次赋值,直到*str2为'\0'结束
  8.  
    {
  9.  
    str1 ;
  10.  
    str2 ;
  11.  
    }
  12.  
    return p;//返回预留的指针P
  13.  
    }
  14.  
    int main()
  15.  
    {
  16.  
    char arr1[20] = {0};
  17.  
    char arr2[] = "helloworld";
  18.  
    char *str = my_strcpy(arr1,arr2);
  19.  
    printf("%s", str);
  20.  
    return 0;
  21.  
    }

    

3.strcmp

        利用my_strcmp函数模拟实现库函数strcmp,依次遍历比较,如果遇到不相等的情况则直接return返回,如果两个字符串相等,则遍历到'\0'再返回0

  1.  
    #define _CRT_SECURE_NO_WARNINGS
  2.  
    #include<stdio.h>
  3.  
    #include<string.h>
  4.  
    int my_strcmp(const char* str1, const char* str2)/*要是不相等,下面的return会结束循环,
  5.  
    要是相等,则遍历到'\0'才结束*/
  6.  
    {
  7.  
    while (*str1 != '\0' || *str2 != '\0')
  8.  
    {
  9.  
    if (*str1 < *str2) //小于则返回-1
  10.  
    return -1;
  11.  
    else if (*str1 > *str2)//大于则返回1
  12.  
    return 1;
  13.  
    else if (*str1 == *str2)//相等则继续比较后面的字符
  14.  
    {
  15.  
    str1 ;
  16.  
    str2 ;
  17.  
    }
  18.  
    }
  19.  
    return 0;//只有相等才会执行到这一步,即相等返回0
  20.  
    }
  21.  
    int main()
  22.  
    {
  23.  
    char arr1[] = "helloworla";
  24.  
    char arr2[] = "helloworld";
  25.  
    int ret = my_strcmp(arr1,arr2);
  26.  
    printf("%d", ret);
  27.  
    return 0;
  28.  
    }

4.strcat

        利用my_strcat函数模拟实现库函数strcat,先找到目标字符串的末尾‘\0’,然后从'\0'处依次赋值,直达遍历到源字符串的末尾'\0'

  1.  
    #define _CRT_SECURE_NO_WARNINGS
  2.  
    #include<stdio.h>
  3.  
    #include<string.h>
  4.  
    char* my_strcat(char* str1, const char* str2)
  5.  
    {
  6.  
    char* p = str1;//保存连接字符串的地址,以便函数结束时返回
  7.  
    while (*str1 != '\0')//遍历找到str1的'\0'处
  8.  
    {
  9.  
    str1 ;
  10.  
    }
  11.  
    while (*str1 = *str2)//从str1的'\0'处依次赋值,直到遍历到str2的'\0'结束
  12.  
    {
  13.  
    str1 ;
  14.  
    str2 ;
  15.  
    }
  16.  
    return p;//返回连接后字符串的地址
  17.  
    }
  18.  
    int main()
  19.  
    {
  20.  
    char arr1[20] = "hello";
  21.  
    char arr2[] = "world";
  22.  
    char *str = my_strcat(arr1,arr2);
  23.  
    printf("%s", str);
  24.  
    return 0;
  25.  
    }

5.strstr

        利用my_strstr函数模拟实现库函数strstr,设置两个指针分别指向两个字符串,再设置一个指针P指向当前开始比较的字符的位置,直到遍历到子串的'\0'位置则已找到子串并返回子串的位置,循环节后仍咩=没有找到子串则说明找不到子串,返回NULL

  1.  
    #define _CRT_SECURE_NO_WARNINGS
  2.  
    #include<stdio.h>
  3.  
    #include<string.h>
  4.  
    char* my_strstr(const char* str1, const char* str2)
  5.  
    {
  6.  
    const char* s1 = str1;//定义s1指向第一个字符串
  7.  
    const char* s2 = str2;//定义s2指向第二个字符串
  8.  
    const char* p = str1;//定义p指向第一个字符串当前开始比较的字符
  9.  
    while (*p)
  10.  
    {
  11.  
    s1 = p; //从p处开始比较
  12.  
    s2 = str2;//从头开始比较
  13.  
    while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)//判断遍历字符是否相等
  14.  
    {
  15.  
    s1 ;
  16.  
    s2 ;
  17.  
    }
  18.  
    if (*s2 == '\0')//如果是因为*s2为'\0'结束,则证明找到子串,返回子串的位置
  19.  
    return p;
  20.  
    p ;//一轮比较后没有找到子串,则从下一个字符开始比较
  21.  
    }
  22.  
    return NULL;
  23.  
    }
  24.  
    int main()
  25.  
    {
  26.  
    char arr1[] = "helloworld";
  27.  
    char arr2[] = "llo";
  28.  
    char *str = my_strstr(arr1,arr2);
  29.  
    printf("%s", str);
  30.  
    return 0;
  31.  
    }

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhieckie
系列文章
更多 icon
同类精品
更多 icon
继续加载