strcat函数

函数理解记忆:str表示是<string.g>中的函数,cat表示附加。意思是将一个字符串的内容附加到另一个字符串的末尾。

注意要点:既然要附加,附加的字符串和被附加的字符串都要有'\0'。否则不知道附加多少,不知附加在哪。

函数的传入值和返回值: char* strcat(char*brr,const char*arr),其中brr是被附加者,arr是附加者。返回附加的结果的指针。

函数的自我实现

char* my_strcat(char* brr, char* arr) {

while (*(brr++) != '\0') { ; } //找到brr的末尾

--brr; //找到'\0'后brr还会加一次,所以要将地址减一

while ((*(brr++) = *(arr++) )!= '\0') { ; } //这里先赋值再判断如果满足地址加加,不满足退出循环

return brr;

}

但是这个代码看着不好看,我们用for循环重新搞一下

char* my_strcat(char* brr, char* arr) {

for (; *brr != '\0'; ++brr); //也满足先判断后增,但是是前增,不会有判断是'\0'后又加一次

for (*brr = *arr; *arr != '\0'; *(++brr)=*(++arr));//先赋值一次,如果arr开始就是'\0'也没问题,不改变brr。然后判断是否满足循环条件,然后继续地址加加的形式赋值。这样可以防止越界

return brr;

}

但是就算是库里面的strcat也有很大的问题,如果我们不把brr的空间搞足就会报错。所以我自己改进了一下。

char* my_strcat(char* brr, char* arr, int capacity_brr) {//因为这里不能用sizeof来求空间,只能自己输入

int lenbrr = (int)strlen(brr);

int lenarr = (int)strlen(arr);

char* newbrr = brr,*pbrr=NULL;

if (capacity_brr < (lenbrr + lenarr)) {

pbrr = (char*)malloc(sizeof(char) * (lenbrr + lenarr));//如果空间不足就创建一个更大的,用不了realloc,因为两个字符串不是malloc或者realloc创建出来的。

if (pbrr == NULL)return NULL;//判断创建好了没

strcpy(pbrr, brr);//把brr的东西拷贝到新的内存中

newbrr = pbrr;

}

int k = 0;

for (; *newbrr != '\0'; ++newbrr)++k;

for (*newbrr = *arr; *arr != '\0'; *(++newbrr)=*(++arr))++k;//同样的操作

return newbrr - k;

}

但是我觉得依然有点问题,这里自己多加了传入值。这里也不能用realloc导致brr空间会浪费掉(不能free)。

相关推荐
无相求码11 小时前
【C语言】字符串的本质是什么,为什么 strlen 会读到野内存
c语言·开发语言
LuminousCPP12 小时前
C 语言集中实践全记录:顺序表 + 单链表原理实现与通讯录项目实战【附可运行源码】
c语言·开发语言·数据结构·经验分享·笔记
SuperByteMaster12 小时前
__set_MSP 和__set_MSPLIM 接口区别
c语言
CS创新实验室14 小时前
NumPy数组的C风格和Fortran风格
c语言·开发语言·numpy
LuminousCPP15 小时前
单链表专题(应用篇):三道经典题吃透删除、反转与快慢指针
c语言·数据结构·笔记
薄情书生16 小时前
基于51单片机的电子钟设计(LCD12864显示 + DS1302)
c语言·51单片机·protues
半条-咸鱼17 小时前
【FreeRTOS】核心原理与实战速查手册
c语言·操作系统·rtos
白帽小阳17 小时前
Typora插件开发指南:打造专属IDE式写作环境
c语言·网络·python·网络安全·github·pygame·护网行动
ysu_03141 天前
06 | 200个单元测试C项目也能TDD
c语言·单元测试·tdd
烟锁池塘柳01 天前
【C/C++】解决C++控制台输出中文乱码问题
c语言·开发语言·c++