• 【C语言 模拟实现strcat函数】


    C语言之模拟实现strcat函数

    前言:
    通过C语言字符串函数的知识,这篇将对strcat函数进行深入学习底层原理的知识,并模拟实现对应功能。

    /知识点汇总/

    1、介绍strcat函数

    函数原型:char *strcat( char *strDestination, const char strSource );
    函数功能:将源头的字符串地址追加到目标字符串的地址,返回值类型为char

    头文件
    使用注意事项
    (1)、源字符串必须以’\0’结束(因为会包括’\0’一起追加过去)
    (2)、追加会将源字符串中的’\0’拷贝到目标空间,从而组成新字符串得结束位标志符
    (3)、目标空间必须足够大,确保能存放源字符串
    (4)、目标空间必须可变(不能是常量)
    (5)、初始化为数组形式时,空间需要指明合适的大小
    示例代码1如下
    步骤
    ①.找到arr1的末尾’\0’
    ②.再把arr1的内容追加到arr1后边(arr2的首地址会覆盖,arr1的’\0’实现追加)

    #include 
    #include 
    
    int main()
    {
    	char arr1[20] = "abc";
    	char arr2[] = "def";
    	strcat(arr1, arr2);
    	printf("%s\n", arr1);//abc(追加)def
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2、模拟实现strcat函数

    #include 
    #include 
    #include 
    
    char* my_strcat(char* dest, const char* src)
    {
    	assert(dest && src);
    	char* ret = dest;
    	//1.找到目标空间的末尾
    	while (*dest != '\0')
    	{
    		dest++;
    	}
    	//2.数据追加
    	while (*dest++ = *src++)
    	{
    		;
    	}
    	return ret;
    }
    int main()
    {
    	char arr1[20] = "abc";//注意:一定要指明目标空间的大小。否则,容易报错栈溢出
    	char arr2[] = "def";
    	my_strcat(arr1, arr2);
    	//my_strcat(arr1, arr1);//自己追加自己不建议,可能会出现一些问题
    	printf("%s\n", arr1);//abcdef
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    解释说明
    1.assert是断言,参数为指针,防止传参过来是空指针避免野指针的问题
    2.用一个指针变量始终保存目标字符串的起始地址,以免目标起始地址发生改变,导致函数的返回值错误
    3.*dest++ != ‘\0’直到将指针指向目标字符串之后的地址,相当于遍历目标字符串
    3.*dest++ = *src++执行的就是依次拷贝字符串的内容,直到遇见’\0’跳出while循环
    注意
    自己追加自己时,源指针和目标指针都指向首字符,然后源字符串的’\0’,会被覆盖掉,导致后面追加时,找不到’\0’了。尽管库函数能实现,但是不建议这样操作。

    3、结语

    学习函数的最实用的方式就是用自己的逻辑简单实现一些类似的功能
    半亩方糖一鉴开,天光云影共徘徊。
    问渠哪得清如许?为有源头活水来。–朱熹(观书有感)

  • 相关阅读:
    面试必考精华版Leetcode994. 腐烂的橘子
    R 语言 ggmap 可视化集群
    部署SeaTunnel单节点Standalone 模式环境
    C++-openssl-aes-加密解密
    时间空间复杂度分析--冒泡排序算法
    基于python高校选课系统设计与实现flask-django-nodejs-php
    外汇天眼:美国9月份新屋开工数再次下降!美联储加息的影响越来越大
    V100 配置 Scanpy + Scvi + Pytorch
    Spring基础知识总结(纯文字版)
    2022全新恶搞放屁小程序源码(云开发)
  • 原文地址:https://blog.csdn.net/m0_69455439/article/details/133513140