模拟实现strlen,strcmp,strcat,strstr

和字符串有关的库函数

函数介绍

  1. strlen

    *size_t strlen ( const char * str ) ;

    作用:用来计算字符串的长度
    注意:字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包 含 ‘\0’ )

    函数使用方式:

    #include <stdio.h>
    #include <string.h>
    int main()
    {
      char str[256];
      printf("请输入需要计算长度的字符串: ");
      gets(str);
      printf("输入的字符串%s的长度为:%lu\n", str,(unsigned)strlen(str));
      return 0;
    }
    

    结果为:
    在这里插入图片描述
    函数模拟实现:

    #include <stdio.h>
    
    int my_strlen1(char* str)
    {
    	//利用递归
    	if (*str == '\0')
    		return 0;
    	return 1 + my_strlen1(str + 1);
    }
    
    int my_strlen2(char* str)
    {
    	//利用指针相减
    	char* p = str;
    	while(*str != '\0')
    		++str;
    	return str - p;
    }
    
    int main()
    {
    	char str[256];
    	printf("请输入需要计算长度的字符串: ");
    	gets(str);
    	printf("输入的字符串%s的长度为:%d\n", str, my_strlen1(str));
    	printf("输入的字符串%s的长度为:%d\n", str,my_strlen2(str));
    }
    

    结果为:
    在这里插入图片描述
    2.strcpy

    char* strcpy ( char * destination,const char * source ) ;

    作用:将目标字符串中的内容替换成为源字符串中的内容(拷贝)
    注意:目标空间必须足够大,以确保能存放源字符串

    函数使用方式:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    	char str1[] = "Sample string";
    	char str2[40];
    	strcpy(str2, str1);
    	printf("str1: %s\nstr2: %s\n", str1, str2);
       return 0;
    }
    

    结果为:
    在这里插入图片描述
    函数模拟实现:

    #include <stdio.h>
    
    char* my_strcpy(char* destination, const char* source)
    {
    	char* start1 = destination;
    	while (*source != '\0')
    	{
    		*start1 = *source;
    		++start1;
    		++source;
    	}
    	*start1 = '\0';
    	return destination;
    }
    
    int main()
    {
    	char str1[] = "Sample string";
    	char str2[40];
    	printf("str1: %s\nstr2: %s\n", str1,my_strcpy(str2, str1));
    }
    

    结果为:
    在这里插入图片描述

  2. strcmp

    int strcmp ( const char * str1 , const char * str2 ) ;

    作用:依靠字典序来比较两个字符串的长度

    注意:

    • 如果str1的长度>str2的长度,返回1;
    • 如果str1的长度=str2的长度,返回0;
    • 如果str1的长度<str2的长度,返回-1;

    函数使用方式:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    	char str1[] = "123";
    	char str2[] = "24";
    	printf("%d\n", strcmp(str1, str2));
        return 0;
    }
    

    结果为:
    在这里插入图片描述
    函数模拟实现:

    #include <stdio.h>
    
    int my_strcmp(const char* str1, const char* str2)
    {
    	while (*str1 == *str2)
    	{
    		++str1;
    		++str2;
    	}
    	if (*str1 > *str2)
    		return 1;
    	else if (*str1 == *str2)
    		return 0;
    	else
    		return -1;
    }
    		
    int main()
    {
    	char str1[] = "123";
    	char str2[] = "24";
    	printf("%d\n", my_strcmp(str1, str2));
    }
    

    结果为:
    在这里插入图片描述

  3. strcat

    char * strcat ( char * destination , const char * source ) ;

    作用:将源字符串连接在目标字符串的后面,并放在目标字符串里面
    注意:目标字符串的空间必须足够大,以便可以容纳源字符串的内容

    函数使用方式:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    	char str1[100];
    	char str2[40];
    	gets(str1);
    	gets(str2);
    	strcat(str1, str2);
    	puts(str1);
        return 0;
    }
    

    结果为:
    在这里插入图片描述
    模拟实现函数:

    #include <stdio.h>
    
    char* my_strcat(char* destination, const char* source)
    {
    	char* start = destination;
    	while (*destination != '\0')
    		++destination;
    	while (*source != '\0')
    	{
    		*destination = *source;
    		++destination;
    		++source;
    	}
    	*destination = '\0';
    	return start;
    }
    		
    int main()
    {
    	char str1[100];
    	char str2[40];
    	gets(str1);
    	gets(str2);
    	my_strcat(str1, str2);
    	puts(str1);
    }
    

    结果为:
    在这里插入图片描述

  4. strstr

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

    作用:判定和查找str2是否在str1中
    注意:没找到返回NULL

    函数使用方式:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    	char str1[] = "1455456789";
    	char str2[] = "456";
    	printf("%s\n", strstr(str1, str2));
        return 0;
    }
    

    结果为:
    在这里插入图片描述
    函数模拟实现:

    #include <stdio.h>
    
    char* my_strstr(const char* str1, const char* str2)
    {
    	const char* p1 = str1;
    	const char* p2 = str2;
    	while (*p1 != '\0')
    	{
    		while (*str1 == *str2)
    		{
    			++str1;
    			++str2;
    		}
    		if (*str2 == '\0')
    			return p1;	
    		++p1;
    		str1 = p1;
    		str2 = p2;
    	}
    	return NULL;
    }
    		
    int main()
    {
    	char str1[] = "1455456789";
    	char str2[] = "456";
    	char str3[] = "457";
    	printf("%s\n", my_strstr(str1, str2));
    	printf("%s\n", my_strstr(str1, str3));
    }
    

    结果为:
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值