string.h里几个常见函数的实现方式(C语言)

以下是我从网上学习的关于strlen、strcpy、strcmp、strcat、strstr实现方式的总结。

一、strlen——求字符串长度

👉strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' ),并且其返回类型为size_t(unsigned int无符号整形)。

  1. 计数器方式

size_t my_strlen1(const char* arr)//const用于使arr所指向的对象不发生改变
{
    assert(arr!=NULL);//需要引用assert.h头文件

    int count=0;
    while(*arr++)
    {
        count ++;
    }
    return count;
}
  1. 不能创建临时变量计数器——用递归

size_t my_strlen2(const char* arr)
{
    assert(arr!=NULL);
    if(*arr)
    {
        return 1+my_strlen2(arr+1);
    }
    return 0;
}
  1. 指针减指针的方式

size_t my_strlen3( char* arr)
{
    assert(arr!=NULL);

    char* tmp=arr;
    while(*tmp!='\0')
    {
        tmp++;
    }
  
    return tmp-arr;
}

👉以上三种方法的输出结果如下

#include <stdio.h>
#include <assert.h>
int main(){
    char arr[20]={0};

    scanf("%s",&arr);
    printf("%d\n", my_strlen1(arr));
    printf("%d\n", my_strlen2(arr));
    printf("%d\n", my_strlen3(arr));

    return 0;
}

二、strcpy——字符串复制

👉strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。

char* my_strcpy(char* dest, const char* src)
{
    char* ret = dest;

    assert(dest && src);

    while (*dest++ = *src++);
    return ret;
}

👉以上方法的输出结果如下

#include <stdio.h>
#include <assert.h>
int main() {

    char dest[20] = "****************";
    char src[20] = { 0 };

    scanf("%s", &src);
    printf("%s\n", my_strcpy(dest, src));

    return 0;
}

三、strcmp——比较字符串str1和str2

👉一般形式:strcmp(str1,str2)

👉该函数返回值如下:

  • 如果返回值小于 0,则表示 str1 < str2。

  • 如果返回值大于 0,则表示 str1 > str2。

  • 如果返回值等于 0,则表示 str1 = str2。

int my_strcmp(const char* str1,const char* str2)
{
    assert(str1&&str2);

    while(*str1==*str2)
    {
        if(*str1=='\0')
        {
            return 0;
        }
        str1++;
        str2++;
}
    return *str1-*str2;
}

👉以上方法的输出结果如下

#include <stdio.h>
#include <assert.h>
int main(){

    char str1[20]={0};
    char str2[20]={0};

    scanf("%s %s",&str1,&str2);

    int ret=my_strcmp(str1,str2);
    if(ret > 0)
    {
        printf("str1 > str2\n");
    }else if(ret < 0)
    {
        printf("str1 < str2\n");
    }else
    {
        printf("str1 = str2\n");
    }
   
    return 0;
}

四、strcat——一个字符串追加到另一字符串的结尾

👉char* my_strcat(char * dest,const char * src)

  • dest —— 指向目标数组

  • src —— 指向要追加的字符串

  • 该函数返回一个指向最终的目标字符串 dest 的指针。

字符串不能自己给自己追加

char* my_strcat(char * dest,const char * src)
{
    char* ret=dest;

    assert(dest&&src);
    //1.找到目标字符串中的'\0'
    while(*dest)
    {
        dest++;
    }
    //2.追加源字符串,包括'\0'
    while(*dest++ = *src++);
    //返回目标空间的起始地址
    return ret;
}

👉以上方法的输出结果如下

#include <stdio.h>
#include <assert.h>
int main(){

    char dest[20]={0};
    char src[20]={0};

    scanf("%s %s",&dest,&src);
    printf("%s\n",my_strcat(dest,src));

    system("pause");
    return 0;
}

五、strstr——返回字符串中首次出现子串的地址

👉char *strstr(const char *str1, const char *str2)

  • str1: 指向被查找目标

  • str2: 指向要查找对象

  • 返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;

如果str2不是str1的子串,则返回NULL。

char* my_strstr(const char* str1, const char* str2)
{
    assert(str1 && str2);
    const char* s1 = NULL;
    const char* s2 = NULL;
    const char* cp = str1;
    
    //1.当被查找目标是空字符串时
    if (*str2 == '\0')
    {
        return (char*)str1;
    }
    //2.当被查找目标不是空字符串时
    while (*cp)
    {
        s1 = cp;
        s2 = str2;
        while (*s1 && *s2 && (*s1 == *s2))
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
        {
            return (char*)cp;
        }
        cp++;
    }
    return NULL;

}

👉以上方法的输出结果如下

int main() {

    char str1[20] = { 0 };   //str1: 指向被查找目标 
    char str2[20] = { 0 };   //str2: 指向要查找对象
    //char str2[]="";
    
    scanf("%s %s", &str1, &str2);
    //scanf("%s", &str1);
    
    //判断str2是不是str1的子串,并返回相应的内容给ret
    char* ret = my_strstr(str1, str2);
 
    if (ret != NULL)
    {
        printf("str2是str1的子串\n");
    }
    else
    {
        printf("str2不是str1的子串\n");
    }

    return 0;
}

如有错漏之处,敬请指正!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值