52.【C语言】 字符函数和字符串函数(strcat函数)

6.strcat函数

*简单使用

cplusplus的介绍 点我跳转

strcat:string concatenate 字符串连接

*网页翻译

函数

strcat


cpp 复制代码
//strcat返回类型char *
char * strcat ( char * destination, const char * source );

连接字符串

目标(destination)字符串 追加源(source)字符串 的一个拷贝,目标字符串 的终止0字符(即\0)**(注意是目标空间的第一个\0)**会被源字符串 的第一个字符覆盖,并且在目标中,0字符(即\0)被包含在由两者连接形成的新字符串的末尾

目标(上方代码定义了destination和source是指针变量) 不得重叠(即地址不能相同)

参数

目标:指向目标数组的指针应该包含C字符串(因为是C语言,所以叫这个名称)而且目标数组应该足够大来容纳追加而成的结果字符串

源:要追加的C字符串,不能和目标重叠(即地址不能相同)

返回值

目标已返回

代码:

cpp 复制代码
#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>//string头文件包含strcat
int main()
{
	char arr1[20] = { "Hello"};
	strcat(arr1, " World!");
	printf("%s", arr1);
	return 0;
}

x86环境下打开内存窗口

输入&arr1

执行完strcat(arr1, " World!");再次查看

很显然是从Hello\0的\0(0x0136FC01)开始追加字符串的

注:0x0136FC01地址处的20是空格

*例题1

求下列代码执行后arr1的结果

cpp 复制代码
#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>//string头文件包含strcat
int main()
{
	char arr1[20] = { "Hello"};
	strcat(arr1, " \0World!");//\0前有一个空格
	printf("%s", arr1);
	return 0;
}

答案速查:

分析:

x86环境下打开内存窗口

输入&arr1

执行完strcat(arr1, " World!");再次查看

仅仅追加了\0前的空格就结束了(追加的字符串stcat以最近的\0为结束标志,停止追加)

*例题2

求下列代码的执行结果

cpp 复制代码
#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>//string头文件包含strcat
int main()
{
	char arr1[20] = { "Hello"};
	strcat(arr1, arr1);
	printf("%s", arr1);
	return 0;
}

答案速查:

分析:

源:要追加的C字符串,不能和目标重叠(即地址不能相同)

自己不能给自己追加!(具体原因见sim_strcat函数的例题3)

*总结strcat函数的使用注意事项

1.格式:char * strcat ( char * destination, const char * source );

2.stcpy从目标空间的第一个\0开始追加,并且覆盖掉\0

3.追加的字符串stcat以第一个\0为结束标志,停止追加

4.自己不能给自己追加

*模拟实现

设计一个函数sim_strcat

destination简写为dest,source简写为src

和strcat函数一样,两个类型为char*的参数,函数返回类型为char*

cpp 复制代码
#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
char* sim_strcat(char* dest, const char* src)//const修饰src
{
	char* ret = dest;
	while (*dest != '\0')
	{
		dest++;
	}//循环停止后dest刚好停在\0的地址处
	while (*dest++ = *src++)
	{

	}//此循环同sim_strcpy函数
	return ret;

}
int main()
{
	char arr1[20] = { "Hello" };
	char* ret = sim_strcat(arr1, " World!");
	printf("%s", ret);
	return 0;
}

注:strcpy函数见:51.【C语言】字符函数和字符串函数(strcpy函数) 点我跳转

*例题3

把上方代码的char* ret = sim_strcat(arr1, " World!");改为char* ret = sim_strcat(arr1, arr1);

求运行结果

答案速查:

显示已引发的异常

分析:

x86环境下打开内存窗口

输入&arr1

红色字体是属于arr1的

步步执行while (*dest++ = *src++)

填充满arr1后仍然循环!(无限循环导致越界访问)

如果自己追加自己可以用strncat函数

相关推荐
Nebula_g4 分钟前
C语言应用实例:硕鼠游戏,田忌赛马,搬桌子,活动选择(贪心算法)
c语言·开发语言·学习·算法·游戏·贪心算法·初学者
爱吃甜品的糯米团子12 分钟前
详解 JavaScript 内置对象与包装类型:方法、案例与实战
java·开发语言·javascript
QT 小鲜肉20 分钟前
【Git、GitHub、Gitee】按功能分类汇总Git常用命令详解(超详细)
c语言·网络·c++·git·qt·gitee·github
郝学胜-神的一滴33 分钟前
Linux下,获取子进程退出值和异常终止信号
linux·服务器·开发语言·c++·程序人生
AI科技星1 小时前
张祥前统一场论动量公式P=m(C-V)误解解答
开发语言·数据结构·人工智能·经验分享·python·线性代数·算法
CodeByV1 小时前
【C++】继承
开发语言·c++
权泽谦2 小时前
用 Python 做一个天气预报桌面小程序(附源码 + 打包与部署指导)
开发语言·python·小程序
ftpeak2 小时前
《Rust+Slint:跨平台GUI应用》第八章 窗体
开发语言·ui·rust·slint
森语林溪2 小时前
大数据环境搭建从零开始(十七):JDK 17 安装与配置完整指南
java·大数据·开发语言·centos·vmware·软件需求·虚拟机
lsx2024062 小时前
HTML 音频(Audio)详解
开发语言