strcat函数
在C语言中,strcat函数用于将两个字符串连接起来,即将源字符串(source string)追加到目标字符串(destination string)的末尾,并返回目标字符串。这个函数定义在头文件<string.h>中。
函数原型如下:
char *strcat(char *dest, const char *src);
dest:目标字符串的指针,这个字符串必须有足够的空间来存放两个字符串连接后的结果。src:源字符串的指针,这个字符串的内容将被追加到dest字符串的末尾。
返回值:strcat函数返回目标字符串的指针,即dest。
注意:
-
空间问题:调用者必须确保
dest指向的字符串有足够的空间来存放两个字符串连接后的结果。如果dest的空间不足以存放连接后的字符串,strcat函数将会导致缓冲区溢出,这是非常危险的,可能会破坏程序的稳定性和安全性。 -
结束符:
strcat函数通过查找dest字符串的\0(空字符)来确定在哪里开始追加src字符串。同时,它会在连接后的字符串末尾添加一个额外的\0来确保字符串正确结束。 -
重叠字符串:如果
dest和src所指向的字符串内存区域存在重叠,那么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宏来检查的,以避免潜在的空指针解引用错误。
-
myStrcat方法首先通过一个循环找到目标字符串des的末尾(即第一个\0字符),然后使用另一个循环将源字符串src的每个字符(不包括终止的\0字符)复制到目标字符串的末尾,但注意在循环结束后,它显式地将目标字符串的新末尾设置为\0。 -
myStrcat2方法则采用了更简洁的方式,利用strcpy函数直接将源字符串src复制到目标字符串des的末尾。这里,通过strlen(des)计算目标字符串的长度,然后将其用作strcpy函数的目标偏移量,从而确保从目标字符串的末尾开始复制。这种方法在逻辑上更为清晰,但需要调用额外的函数来计算长度。 -
myStrcat3方法与myStrcat非常相似,都是通过先找到目标字符串的末尾,然后使用循环将源字符串复制到该位置。不同之处在于,它没有使用额外的变量来保存目标字符串的初始地址,而是直接操作des指针,并在循环结束后显式地将新的末尾设置为 '\0'。
总的来说,这三种方法都有效地实现了字符串的连接功能,但在代码简洁性和效率上略有不同。myStrcat2通过调用strlen和strcpy简化了逻辑,但可能因额外的函数调用而略有影响性能;而myStrcat和myStrcat3则通过手动遍历和复制字符来避免额外的函数调用,但在代码长度和可读性上可能稍显冗长。