目录
  • 1.函数介绍
    • 1.1.函数接口
    • 1.2.函数分析
    • 1.3.函数的简单使用
  • 2.库函数strcat源代码
    • 库函数分析
  • 3.模拟实现 strcat 函数
    • 模拟实现
    • 总结分析
  • 写在后面

    strcat函数详解如下

    1.函数介绍

    1.1.函数接口

    char* __cdecl strcat (char * dst, const char * src);
    

    这里是库函数里面的函数定义接口。这个函数是将字符串src连接到dst中去,就是连接字符串函数。

    1.2.函数分析

    分析:

    1、dst 和 src 字符串结尾都必须含有 ’ \0 ';

    2、dst 字符串是可变的,不能用 const 修饰;src 可以用 const 修饰。

    3、就是 dst 目标字符串的空间必须足够大。

    4、该函数返回值是字符指针类型。

    1.3.函数的简单使用

    代码展示如下:

    int main()
    {
    	char ch1[20] = "Hello";
    	char ch2[] = "World";
    	strcat(ch1, ch2);
    	printf("%s\n", ch1);
    	return 0;
    }
    

    图解分析:

    strcat函数连接前:

    彻底掌握C语言strcat函数的用法

    strcat函数连接后:

    彻底掌握C语言strcat函数的用法

    彻底掌握C语言strcat函数的用法

    2.库函数strcat源代码

    char * __cdecl strcat (char * dst, const char * src)//__cdecl:是函数调用约定
    {
    	char * cp = dst;
    	while( *cp )
    	cp++;                 //find end of dst 
    	while((*cp++ = *src++) != '\0') ;       //Copy src to end of dst 
    	return( dst );                  //return dst 
    }

    库函数分析

    分析:

    1、这里 dst 就没有用 const 修饰,而 src 就可以用 const 修饰。

    2、这里定义一个新的字符指针 cp 指向 dst 起始位置,然后 cp 开始循环操作,dst 这个指针始终指向字符串开头,最终返回 dst 指向的字符串。

    3、先要找目标空间那个起始字符串的尾部,然后再在后面连接。

    4、while((*cp++ = *src++) != ‘\0’) ; 这一句就以最简洁的代码实现字符串连接。

    3.模拟实现 strcat 函数

    模拟实现

    char* my_strcat(char* str1, const char* str2)
    {
    	char* first = str1;
    	assert(str1 && str2);
    	//目标空间的'\0'
    	while (*str1 != '\0')
    	{
    		str1++;
    	}
    	//追加内容到目标空间
    	while (*str1++ = *str2++)
    	{
    		;
    	}
    	return first;
    }
    int main()
    {
    	char ch1[20] = "Hello";
    	char ch2[] = "World";
    	printf("%s\n", my_strcat(ch1, ch2));//这里包含链式访问
    	return 0;
    }
    

    总结分析

    1、这是模拟实现strcat函数,里面相关的细节和源代码中的相同。

    2、链式访问:就是把一个函数的返回值当作另一个函数的参数来使用,就是链式访问。

    写在后面

    友友们,相聚的时刻总是短暂的,又到了说再见的时候啦~  但是字符串这一块经常在面试的时候会出模拟实现某某字符串函数的面试题,因此我们不能只会平时利用头文件直接调用而不去摸清原理哈~ 要做到 摸清、拿捏、吃透 字符串函数。

    以上代码均可运行,所用编译环境为 vs2019 ,运行时注意加上编译头文件#define _CRT_SECURE_NO_WARNINGS 1

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。