C语言——字符串拼接strcat及自实现代码

strcat函数

在C语言中,strcat函数用于将两个字符串连接起来,即将源字符串(source string)追加到目标字符串(destination string)的末尾,并返回目标字符串。这个函数定义在头文件<string.h>中。

函数原型如下:

char *strcat(char *dest, const char *src);
  • dest:目标字符串的指针,这个字符串必须有足够的空间来存放两个字符串连接后的结果。
  • src:源字符串的指针,这个字符串的内容将被追加到dest字符串的末尾。

返回值:strcat函数返回目标字符串的指针,即dest

注意:

  1. 空间问题:调用者必须确保dest指向的字符串有足够的空间来存放两个字符串连接后的结果。如果dest的空间不足以存放连接后的字符串,strcat函数将会导致缓冲区溢出,这是非常危险的,可能会破坏程序的稳定性和安全性。

  2. 结束符strcat函数通过查找dest字符串的\0(空字符)来确定在哪里开始追加src字符串。同时,它会在连接后的字符串末尾添加一个额外的\0来确保字符串正确结束。

  3. 重叠字符串:如果destsrc所指向的字符串内存区域存在重叠,那么strcat函数的行为是未定义的。在这种情况下,应该使用strncat函数,它允许你指定要追加的最大字符数,从而避免潜在的问题。

示例代码:

#include<stdio.h>
#include<string.h>

int main()
{
	char str[128] = "wm";
	char *p = " so beautiful!";
	
    strcat3(str,p);
	puts(str);
	return 0;
}

输出:

wm so beautiful!

strcat函数自实现

代码:

char* myStrcat(char* des,char* src)
{
	char *back = des;

	assert(des != NULL && src != NULL);
	while(*des != '\0')
	{
		des++;
	}
	while((*des++ = *src++) != '\0');
	*des = '\0';
	return back;
}

char* myStrcat2(char* des,char* src)
{
	char *back = des;

	assert(des != NULL && src != NULL);
	strcpy(des+strlen(des),src);
	return back;
}

char* myStrcat3(char* des,char* src)
{
	char *back = des;

	assert(des != NULL && src != NULL);
	
	for(;*des!='\0';des++);
	while((*des++ = *src++) != '\0');
	*des = '\0';
	return back;
}

注意:

这些代码段提供了三种不同的实现方式,用于模拟标准库函数strcat的功能,即将两个字符串(源字符串src)连接到目标字符串(des)的末尾,并返回目标字符串的指针。每种实现都确保了目标字符串des和源字符串src非空,这是通过assert宏来检查的,以避免潜在的空指针解引用错误。

  1. myStrcat 方法首先通过一个循环找到目标字符串des的末尾(即第一个\0字符),然后使用另一个循环将源字符串src的每个字符(不包括终止的\0字符)复制到目标字符串的末尾,但注意在循环结束后,它显式地将目标字符串的新末尾设置为\0

  2. myStrcat2 方法则采用了更简洁的方式,利用strcpy函数直接将源字符串src复制到目标字符串des的末尾。这里,通过strlen(des)计算目标字符串的长度,然后将其用作strcpy函数的目标偏移量,从而确保从目标字符串的末尾开始复制。这种方法在逻辑上更为清晰,但需要调用额外的函数来计算长度。

  3. myStrcat3 方法与myStrcat非常相似,都是通过先找到目标字符串的末尾,然后使用循环将源字符串复制到该位置。不同之处在于,它没有使用额外的变量来保存目标字符串的初始地址,而是直接操作des指针,并在循环结束后显式地将新的末尾设置为 '\0'

总的来说,这三种方法都有效地实现了字符串的连接功能,但在代码简洁性和效率上略有不同。myStrcat2通过调用strlenstrcpy简化了逻辑,但可能因额外的函数调用而略有影响性能;而myStrcatmyStrcat3则通过手动遍历和复制字符来避免额外的函数调用,但在代码长度和可读性上可能稍显冗长。

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hardStudy_h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值