当前位置: 首页 > news >正文

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

6.strcat函数

*简单使用

cplusplus的介绍 点我跳转

strcat:string concatenate 字符串连接

*网页翻译

函数

strcat


//strcat返回类型char *
char * strcat ( char * destination, const char * source );

连接字符串

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

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

参数

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

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

返回值

目标已返回

代码:

#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的结果

#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

求下列代码的执行结果

#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*

#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函数

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Oracle EBS中AR模块的财务流程概览
  • 《数据结构(C语言版)第二版》第八章-排序(8.5-归并排序、8.6基数排序、8.7 外部排序)
  • Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C语言)
  • thrift与dubbo对比
  • 《OpenCV计算机视觉》—— 图像轮廓检测与绘制
  • 在Deepin上安装Cursor
  • Rust运算符
  • Nacos1.X中对NacosNamingService的实现
  • Google大数据架构技术栈
  • HOT 100(七)栈、堆、贪心算法
  • 定时任务和延时任务
  • 前端页面中使用 ppt 功能,并且可以随意插入关键帧
  • uniapp的苹果全屏播放再退出会导致页面字体变大解决方法
  • C语言代码练习(第二十三天)
  • 【Hot100】LeetCode—169. 多数元素
  • [译] React v16.8: 含有Hooks的版本
  • [译] 怎样写一个基础的编译器
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • CentOS7简单部署NFS
  • Fastjson的基本使用方法大全
  • go语言学习初探(一)
  • leetcode讲解--894. All Possible Full Binary Trees
  • node和express搭建代理服务器(源码)
  • PHP的Ev教程三(Periodic watcher)
  • springboot_database项目介绍
  • TypeScript迭代器
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 关于使用markdown的方法(引自CSDN教程)
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 京东美团研发面经
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • Semaphore
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (vue)页面文件上传获取:action地址
  • (纯JS)图片裁剪
  • (第二周)效能测试
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (四)js前端开发中设计模式之工厂方法模式
  • (一)Linux+Windows下安装ffmpeg
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)http-server应用
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .chm格式文件如何阅读
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET导入Excel数据
  • .NET中的Exception处理(C#)
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [Android]How to use FFmpeg to decode Android f...
  • [C/C++]数据结构 深入挖掘环形链表问题
  • [C++] 深入理解面向对象编程特性 : 继承
  • [Cesium学习]