文章目录
- strcpy函数描述
- 函数使用
- 总结
- 目标空间为什么必须可变?
- 模拟实现
strcpy函数描述
重点:including the terminating null character (and stopping at that point).意为拷贝的值包括停止字符
传参时第一个参数为要拷贝参数,第二个参数为被拷贝参数
函数使用
#include<stdio.h>
#include<string.h>int main() {char str1[20] = "abcdefg";char str2[] = "zxcv";strcpy(str1, str2);printf("%s\n", str1);return 0;
}
结果:
拷贝之后:
可知在拷贝时‘\0’也被拷贝过来了。
2.
//提前结束被拷贝的字符串
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>
#include<string.h>int main() {char str1[20] = "abcdefg";char str2[] = "zxcvv\0bnm";strcpy(str1, str2);printf("%s\n", str1);return 0;
}
结果:
拷贝后的结果:
总结
1.目标空间必须足够大且可变
2.结束字符也会被拷贝过去
3源字符串必须以‘\0’结束
目标空间为什么必须可变?
错误示例:
#include<stdio.h>
#include<string.h>int main() {char* p = "abcdefg";char str2[] = "zxcv";strcpy(p, str2);printf("%s\n", *p);return 0;
}
目标字符串常量字符串不允许被修改,必须写成数组的形式
模拟实现
#include<stdio.h>
#include<assert.h>char* my_strcpy(char* dest,const char* src)
{//函数返回值为目标空间的起始地址,*dest++ = *src++会改变dest的地址,所以要先保存char* ret = dest;assert(src && dest);while (*dest++ = *src++) //加到最后先把结束字符拷贝过去,然后在判定循环是否可以再运行{;}return ret;
}int main() {char str1[20] = "xxxx";char str2[] = "abcdefghi";my_strcpy(str1, str2);printf("%s\n", str1);return 0;
}
所传参数为地址,所以两个参数都要进行判空操作,都不能为空指针