#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main() {
char arr1[20] = { 0 };
char arr2[] = "abcdef";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
strcpy函数需要在arr2中遇见\0后把全部字符包括\0拷贝放在arr1中
如果在arr2中找不到\0strcpy函数就会一直往后寻找 最终会导致越界
//char arr2[] ={'a','b','c','d'}; 注意字符串中默认最后一个字符是\0,而在一个一个的字符中是没有\0的 如果是这样的arr2的话strcpy函数在进行拷贝的时候找不到\0就会出错
//char arr2[] ={'a','b','c','d','\0'}; 而这样写就可以找到\0的位置 并且返回给arr1了
strcpy函数使用时:
1.源字符串必须以\0结束
2.会将源字符串中的\0拷贝到目标空间
3.目标空间必须足够大,以确保能存放源字符串
char arr[4]={0};
char arr[]="abcdef";
strcpy(arr1, arr2);
这样会报错 因为strcpy就是一个愣头青它不管你内存多少就是给你拷贝进去就完事了,你让我拷贝我就去拷贝 快就完事了压根就不管目标函数放不放得下.
4.目标空间必须可变
char *arr="asdfghjkl";
char arr[]="abcdef";
strcpy(arr1, arr2);
这样打印出来程序会崩溃,:
arr1指向的是常量字符串 常量是不可修改的
模拟实现strcpy函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
//strcpy返回的是目标地址的起始地址
//strcpy函数的返回类型的设置是为了实现链式访问
char* my_strcpy(char* dest,const char* src) {
assert(dest && src);
char* ret = dest;
while (*dest++ = *src++) {
}
return ret;
}
char* my_strcpy1(char* dest, const char* src) {
assert(dest && src);
while (*src!='\0') {
*dest = *src;
dest++;
src++;
}
*dest = *src; // 把最后的\0放进去
return dest;
}
int main() {
char arr1[20] = { 0 };
char arr2[] = "hello world";
// my_strcpy1(arr1, arr2);
//strcpy函数的返回类型的设置是为了实现链式访问
printf("%s\n", my_strcpy1(arr1, arr2));
return 0;
}
两种方法 中的源头src都是不会改变的所以直接加上const修饰 增强代码的健壮性
第一种方法把src的地址给dest中且两个的元素都加上1不为\0一直继续
知道一方为\0是 给到dest后程序结束
第二种方法比较好理解 当src不为\0时把源地址给到目标地址 然后两个元素都加上1进行循环然后到最后的str等于\0时就退出程序 发现少了一个\0的传递 最后再讲*src也就是最后的一个\0给到*dest中 完成了模拟实现strcpy函数