关于strcpy函数和strcat函数的使用、实现
一、strcpy函数
strcpy函数的作用是复制字符串,strcpy是C语言的一个标准库函数 ,strcpy把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char*。它是string copy(字符串复制)的缩写。
1.1代码展现
#include<stdio.h>
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "boy";
strcpy(arr1, arr2);
//我们要把arr2拷贝到arr1中,希望arr1变成boy,而不是boydefghi,所以要把arr2的\0也拷贝过去
printf("%s", arr1);
return 0;
}
1.2注意要点
1.2.1源字符串必须以\0结束
举个反例,见代码:
#include<stdio.h>
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = {'b','o','y'};
strcpy(arr1, arr2);
//源字符串arr2中不包含\0,当程序运行起来的时候,会一直往后越界访问,直到遇到\0,函数才会结束
printf("%s", arr1);
return 0;
}
程序会紊乱,arr1将变得很“奇怪”!
1.2.2会将源字符串中的\0拷贝到目标空间
arr2中的’b’,‘o’,‘y’,'\0’一起被拷贝到arr1中,并替换掉arr1中的前四个元素。
(实际上是arr1变成了 ‘b’ ‘o’ ‘y’ ‘\0’ ‘e’ ‘f’ ‘g’ ‘h’ ‘i’ ‘\0’,遇到第一个\0便不再往下访问了,所以arr1打印出boy)
1.2.3目标空间必须足够大,以确保能够存放源字符串
举个反例,见代码:
#include<stdio.h>
int main()
{
char arr1[] = "a";
char arr2[] = "boy";
strcpy(arr1, arr2);
//源字符串比目标字符串大,当函数运行起来的时候会越界访问,程序报错
printf("%s", arr1);
return 0;
}
程序报错:
1.2.4目标空间必须可改变
同样举个反例:
#include<stdio.h>
int main()
{
char* arr1 = "abcdefghi";
char arr2[] = "boy";
strcpy(arr1, arr2);
//目标字符串arr1内容不可被改变,此时运行程序会崩溃
printf("%s", arr1);
return 0;
}
程序崩溃,在visual studio2022不输出任何内容。
1.3实现
//模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest);
assert(src);
char* ret = dest;
//拷贝src指向的字符串到dest指向的空间,包括\0
while (*dest++ = *src++)//比如当把元素b拷贝过去时候,该式子的结果就是b,把\0拷贝过去时,结果就是0
{
;
}
//返回目的地的空间的起始地址
return ret;
}
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "boy";
my_strcpy(arr1, arr2);
printf("%s", arr1);
}
二、strcat函数
strcat是字符串连接函数,把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除* dest原来末尾的“\0”)。要保证* dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。
2.1代码展现
#include<stdio.h>
int main()
{
char arr1[20] = "hello";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
2.2注意要点
2.2.1目标空间必须有足够大的空间
目标空间要容得下目标空间的字符串加上源字符串
举个反例:
#include<stdio.h>
int main()
{
char arr1[] = "hello";
char arr2[] = "world";
//目标空间必须足够大。目标空间太小了,无法容下helloworld
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
此时程序报错:
2.2.2源字符串必须以\0结束
这里的道理和上面strcpy函数一样,不再举例了。(见上文1.2.1)
2.2.3目标空间必须可改变
道理同样和strcpy函数一样,也不再重复了。(见上文1.2.4)
2.2.4不能自己给自己追加
(请参考下面的图和实现代码)
当使用strcpy,arr1自己给自己追加时,'h’覆盖了‘\0’,于是arr1就没有\0了,于是这个函数永远都不会停下来,程序崩溃!
2.3实现
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
//1、找到目的字符串的\0
while(*dest!='\0')
{
dest++;
}
//2、追加
while(*dest++=*src++)
{
;
}
return ret;
}
int main()
{
char arr1[30] = "hello";
char arr2[] = "world";
//调试时打开监视,若某一个x变成了\0,则说明\0也被传递过去了。
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}