文章目录
【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