模拟实现strlen,strcmp,strcat,strstr

本文深入探讨了C语言中常见的字符串操作函数,如strlen、strcpy、strcmp、strcat和strstr的功能与使用方法,并提供了详尽的代码示例,帮助读者理解和掌握字符串处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

和字符串有关的库函数

函数介绍

  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));
    }
    

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

内容概要:本文介绍了基于Python实现的SSA-GRU(麻雀搜索算法优化门控循环单元)间序列预测项目。项目旨在通过结合SSA的全局搜索能力和GRU的序信息处理能力,提升间序列预测的精度和效率。文中详细描述了项目的背景、目标、挑战及解决方案,涵盖了从数据预处理到模型训练、优化及评估的全流程。SSA用于优化GRU的超参数,如隐藏层单元数、学习率等,以解决传统方法难以捕捉复杂非线性关系的问题。项目还提供了具体的代码示例,包括GRU模型的定义、训练和验证过程,以及SSA的种群初始化、迭代更新策略和适应度评估函数。; 适合人群:具备一定编程基础,特别是对间序列预测和深度学习有一定了解的研究人员和技术开发者。; 使用场景及目标:①提高间序列预测的精度和效率,适用于金融市场分析、气象预报、工业设备故障诊断等领域;②解决传统方法难以捕捉复杂非线性关系的问题;③通过自动化参数优化,减少人工干预,提升模型开发效率;④增强模型在不同数据集和未知环境中的泛化能力。; 阅读建议:由于项目涉及深度学习和智能优化算法的结合,建议读者在阅读过程中结合代码示例进行实践,理解SSA和GRU的工作原理及其在间序列预测中的具体应用。同,关注数据预处理、模型训练和优化的每个步骤,以确保对整个流程有全面的理解。
好的,我很乐意为您介绍C语言中strcpy、strcatstrcmpstrstr这几个标准库函数的实现方式。这些函数都是操作字符串的常用函数,下面我将逐一为您解释它们的实现原理: 1. strcpy(字符串复制): ```c char *strcpy(char *dest, const char *src) { char *ret = dest; while ((*dest++ = *src++) != '\0'); return ret; } ``` 这个函数逐个字符复制src指向的字符串到dest指向的内存位置,直到遇到字符串结束符'\0'。 2. strcat(字符串连接): ```c char *strcat(char *dest, const char *src) { char *ret = dest; while (*dest != '\0') dest++; while ((*dest++ = *src++) != '\0'); return ret; } ``` 这个函数首先将dest指针移动到字符串末尾,然后将src指向的字符串逐个字符复制到dest的末尾。 3. strcmp(字符串比较): ```c int strcmp(const char *s1, const char *s2) { while (*s1 && (*s1 == *s2)) { s1++; s2++; } return *(unsigned char *)s1 - *(unsigned char *)s2; } ``` 这个函数逐个字符比较两个字符串,直到遇到不同的字符或者字符串结束符。返回值表示两个字符串的关系。 4. strstr(字符串查找): ```c char *strstr(const char *haystack, const char *needle) { if (!*needle) return (char *)haystack; for (; *haystack; ++haystack) { if (*haystack == *needle && strncmp(haystack, needle, strlen(needle)) == 0) return (char *)haystack; } return NULL; } ``` 这个函数在主字符串(haystack)中查找子字符串(needle)第一次出现的位置。它使用strncmp函数来比较子字符串。 这些实现方式都是标准库函数的基本实现原理。在实际使用中,建议使用标准库提供的函数,因为它们通常经过优化,并且考虑了各种边界情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值