首页 > 其他分享 >C语言——字符串拼接strcat及自实现代码

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

时间:2024-07-27 23:26:57浏览次数:8  
标签:src des strcat C语言 char 拼接 字符串 末尾

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则通过手动遍历和复制字符来避免额外的函数调用,但在代码长度和可读性上可能稍显冗长。

标签:src,des,strcat,C语言,char,拼接,字符串,末尾
From: https://blog.csdn.net/weixin_45720999/article/details/140602448

相关文章

  • 数据结构——链式二叉树(C语言版)
    链式二叉树的结构⽤链表来表⽰⼀棵⼆叉树,即⽤链来指⽰元素的逻辑关系。通常的⽅法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址。                                ......
  • 学习c语言第十五天(初阶测评)
    选择题1.下列程序输出结果为672.下列程序输出结果为 死循环打印3.i和j的值分别为什么 214.k的终值是什么905.输出结果是什么 16.正确的是    C7.C语言规定main函数位置    C8.不正确的是    D9.正确的是     c ......
  • C语言初阶(6)
    1.函数递归定义程序调用自身的编程技巧称为递归。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可......
  • 15.C语言形式参数和实际参数的介绍及函数总结
    形参和实参的介绍及函数总结1.形式参数和实际参数2.获取两个最大的数3.关于函数的一些总结1.形式参数和实际参数实际参数可以是常量、变量、表达式y=get(1);//常量y=get(x);//变量y=get(x+1);//表达式形参和实参数值相同,地址不同(传递参数是数值的传递......
  • C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
    写在最前,一篇文章学会C语言指针顶级重要,学习C语言最重要的一部分-------指针第八章指针超详细讲解_指针变量_二维数组指针_指向字符串指针文章目录写在最前,一篇文章学会C语言指针第八章指针超详细讲解_指针变量_二维数组指针_指向字符串指针1.指针变量1.1指针变......
  • C语言的函数递归
    一、递归的意义所谓函数递归,就是在某个函数中再次调用这个函数本身,做到函数自己调用自己,这个就是函数的递归。而函数的递归主要是的作用是将一个本身比较复杂,并且步骤繁多的函数逐次的递归使其变得简单化,就比如剥笋:我们想要得到里面能吃的部分,就需要剥笋。而笋的皮有很多层,每......
  • 入门C语言Day18——break&continue&goto语句
    前面的博文中有提到do-while与for循环语句,其中的流程图中有break和continue这两个部分还没解释。所以今天先来解释一下break与continue语句。break和continue两个关键字都被运用在循环中。break的作用是永久的终止循环,只要break被执行,直接就会跳出循环,继续往后执行。......
  • 写一个函数返回参数二进制中1的个数(c语言)
    1.int一共有32位,我们要知道一个数取余2等于1(n%2==1),就可以得到二进制中1的个数.然后一个数除于2(n=n/2),就可以使32位向右一位(例如:5为101,5/2==2,2为10,)。方法1(不可以输入负数)//写一个函数返回参数二进制中1的个数//方法1intcount(intn,intz){ //当a为正数的 if(n>......
  • 调整奇数全部位于偶数前面(c语言)
    1.方法一:第一步先建一个arr,判断arr中的奇数(arr[i]%2!=0)和偶数(arr[i]%2==0)分别打印,先打印奇数,后打印偶数。//调整奇数全部位于偶数前面//方法一voidtest(int*arr,intsz){ inti=0; for(i=0;i<sz-1;i++) { if(arr[i]%2!=0) { printf("%d......
  • 简单的扫雷——基于C语言的控制台小游戏
    前言:  “将大象装进冰箱要几步?--打开冰箱,把大象放进去,关上冰箱。”  同样的,该扫雷游戏的编写过程也只需三步:逻辑梳理-代码实现-运行调试。本文将使用C语言来一步步剖析并完成扫雷这一案例。一.扫雷的游戏逻辑  该扫雷的游戏逻辑为:  1.生成棋盘,并布置数个......