自学内容网 自学内容网

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


原文地址:https://blog.csdn.net/weixin_45720999/article/details/140602448

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!