【C语言基础】标准库函数strcat的使用


【C语言基础】标准库函数strcat的使用


今天在使用strcat函数时一直报错,发现它第一个参数应是具有足够大、定长、可修改的空间。
(os:还是要打好基础💪)

一、功能解释

strcat函数功能是实现字符串的拼接,广义上可看作strcat(str1, str2),其原理是通过找到str1的第一个"\0"位置,并在此位置上拼接str2的内容,至str2的"\0"为止拼接完毕。

二、函数原型

所需的头文件:

#include <string.h>

函数原型:

char *strcat (char *str1, const char *str2)

其中,str1表示目标字符串地址,本质是一个足够大、定长、可修改字符数组
str2表示源字符串地址,必须以"\0"结尾

三、使用示例

使用时,以下几种情况都是可行的:

1、使用字符数组作为第一个参数:

char str1[50] = "Hello";
char str2[] = " World";
strcat(str1, str2);

2、使用指向字符数组的指针作为第一个参数:

char str1[50] = "Hello";
char* ptr = str1;
char str2[] = " World";
strcat(ptr, str2);

3、使用字符串常量作为第二个参数:

char str1[50] = "Hello";
strcat(str1, " World");

4、使用字符数组作为第二个参数:

char str1[50] = "Hello";
char str2[] = " World";
strcat(str1, str2);

5、使用指针变量作为第二个参数:

char str1[50] = "Hello";
char* str2 = " World";
strcat(str1, str2);

四、踩坑排雷

1、在上述使用示例2中,指针变量ptr看上去经过赋值传递就是"Hello",那么可以让它直接="Hello"吗?

//char str1[50] = "Hello";//50不可省略,需要足够两个字符串的长度
//char* ptr = str1;
char* ptr = "Hello";
char str2[] = " World";
strcat(ptr, str2);

答案是:不可以。
因为我们已知C语言中使用引号括起来的"Hello"本身是一个字符串常量,是储存在静态存储区且不可修改的
而使用char str1[50] = "Hello"和char* ptr = "Hello"的区别在于:①前者在赋值的时候是将字符串常量复制到字符数组中去的,此时str1已经变身为字符数组,该数组可修改;②后者是将指针直接指向字符串常量的地址,但他本身还是常量不可修改。
所以我们可以看出strcat函数的第一个参数本质上还是一个足够大、定长、可修改字符数组

2、如果你的数据确实就是两个字符串常量怎么办?

可以使用动态内存分配函数(如malloc,记得free释放)来创建一个新的可修改的字符数组,并将两个字符串拷贝拼接到新的数组中

const char* str1 = "Hello";
const char* str2 = " World";

size_t len1 = strlen(str1);
size_t len2 = strlen(str2);
char* result = (char*)malloc((len1 + len2 + 1) * sizeof(char));// 声明一个新空间并分配足够的内存,+1是为了存储字符串结束符'\0'

//char result[100];// 也可以直接创建一个足够大的字符数组

strcpy(result, str1);// 把str1拷贝到result
strcat(result, str2);// 把str2拼接到result

参考:https://blog.csdn.net/weixin_53564801/article/details/123726646

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值