strcpy函数模型
- char * strcpy( char * strDestination, const char * strSource );
- 函数头文件:string.h
strcpy函数的作用和用法
函数说明
- strcpy函数将strSource(包括终止null字符)复制到由strDestination指定的位置
- 复制或追加字符串时不执行溢出检查
- 如果源字符串和目标字符串重叠,则strcpy的行为是未定义的。
函数参数
- char * strDestination: 指向用于存储复制内容的目标数组。
- char * strSource: 要复制的字符串。
函数用法实例
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "##################";
char arr2[] = "abcdef";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
- 效果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/77aec7a916061d1106841b6678ddb8f4.png)
手动写strcpy函数
#include <stdio.h>
void my_strcpy(char *dest, char *src)
{
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = *src;
}
int main()
{
char arr1[] = "##################";
char arr2[] = "abcdef";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
- 上面的代码虽然模拟了strcpy函数,但是有很多不足的地方,所以我们接下来对这段代码进行改进
- 首先是目标字符串和要复制的字符串不能为空,如果为空,就没必要进行复制
- 其次是要复制的字符串是不能被改变的,所以我们传入函数时,将其以常量字符串的形式传入,防止在调用过程中被修改
#include <stdio.h>
#include <assert.h>
void my_strcpy(char *dest, const char *src)
{
assert(dest != NULL);
assert(src != NULL);
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = *src;
}
int main()
{
char arr1[] = "##################";
char arr2[] = "abcdef";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
- 虽然已经解决了上面的问题,但是代码依然不够简洁, 所以我们继续改进我们的代码,让我们的代码更加简洁
#include <stdio.h>
#include <assert.h>
void my_strcpy(char *dest, const char *src)
{
assert(dest != NULL);
assert(src != NULL);
while (*dest++ = *src++)
{
;
}
}
int main()
{
char arr1[] = "##################";
char arr2[] = "abcdef";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
- 上面的代码已经被修改的非常简洁,但是跟我们文章开头的strcpy函数的模型又有点差别
- strcpy函数模型:char * strcpy( char * strDestination, const char * strSource );
- 从strcpy的函数模型中可以看到,strcpy的返回值是char * ,但是我们写的代码是没有返回值的,所以我们继续对代码进行改进
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char *dest, const char *src)
{
assert(dest != NULL);
assert(src != NULL);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "##################";
char arr2[] = "abcdef";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/07fb5a401922e88468114335557ec12a.png)
strcpy注意事项
- 原字符串必须以‘\0’结束
- 目标空间足够大,以确保能存放原字符串
- 目标空间必须可变