strcat字符串链接
将src(源)地址中的内容追加/链接到des(目标)地址后面,覆盖des(目标)地址末尾的‘\0’字符。
des(目标)内存空间大于或等于src+des+’\0’的长度
#include<stdio.h>
#include<assert.h>
char* Mystrcat(char* des, const char* src)//字符串链接
{
assert(des != NULL && src != NULL);
char* p = des;
while (*des != '\0')//将指针des移动指向'\0'
{
des++;
}
while (*src != '\0')
{
*des++ = *src++;
}
return p;
}
int main()
{
char irr[20] = "hello";
const char jrr[] = "world";
char* str1 = irr;
const char* str2 = jrr;
printf("%s\n", Mystrcat(str1, str2));//helloworld
return 0;
}
des(目标)内存空间不足
- 定义一个较大的第三方静态局部变量
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* Mystrcat(char* des, const char* src)//字符串链接
{
assert(des != NULL && src != NULL); //断言,两个字符串都不为空,需要头文件#include<assert.h>
static char str3[1024];//函数返回局部变量要加static,静态局部变量,程序退出时才销毁
char* p = str3;
while (*des != '\0')//将str1中\0之前的所有字符赋给p
{
*p++ = *des++;//后置++,先进行赋值,然后对当前地址解引用,然后再++
//*p = *str1;
//p++;
//str1++;
}
while (*src != '\0')//此时p已经++,将str2中\0之前的所有字符赋给p,即链接在str1的字符之后
{
*p++ = *src++;//先赋值解引用然后++,对++之前地址的str2解引用进行判断
}
*p = '\0';//此时在p已有的字符之后的地址,直接赋值\0即可
return str3;
}
int main()
{
char irr[] = "hello";
const char jrr[] = "world";
char* str1 = irr;
const char* str2 = jrr;
printf("%s\n", Mystrcat(str1, str2));//helloworld
return 0;
}
内置字符串追加/链接函数strcat
- char *strcat(char *des, const char *src)
- 具有返回值即字符串的首地址,支持字符串的链式表达
- 需要头文件 #include<string.h>
- 不会检查des(目标)空间大小
- VS2019不能够直接使用,可以在开头添加取消错误提醒的声明 #define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char irr[20] = "hello";//内存空间不足,导致越界,会报错
const char jrr[] = "world";
char* str1 = irr;
const char* str2 = jrr;
printf("%s\n", strcat(str1, str2));
return 0;
}
内置字符串追加/链接函数strcat_s
- errno_t strcat_s(char* des, size_t numberOfElements, const char* src)
- 将src(源)地址中的内容追加/链接到des(目标)地址。
- numberOfElements为缓冲区的大小,其大于等于des+src+’\0’,且小于等于des
- 返回值类型errno_t,用于判断是否链接成功。
- des必须大于等于des+src+’\0’的大小
#include<stdio.h>
#include<string.h>
int main()
{
char irr[20] = "hello";
const char jrr[] = "world";
char* str1 = irr;
const char* str2 = jrr;
strcat_s(str1, strlen(str1) + strlen(str2) + 1, str2);
strcat_s(str1, strlen(str1) + strlen(str2) + 1, str2);//都可以
strcat_s(str1, sizeof(irr), str2);
printf("%s\n", str1);//helloworld
return 0;
}
注:
此处sizeof是求数组irr实际大小,而不是指针str1的大小。
sizeof(str1)只是求指针的大小为4个字节。