目录
1. 函数声明及功能
char * strcpy ( char * destination, const char * source );
strcpy功能:字符串拷贝
2. 使用示例
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char arr1[] = "hello world";
char arr2[15] = {0};
strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
3. 注意事项
1、拷贝源字符串时,以'\0'作为拷贝结束标志,且将'\0'也拷贝到目标空间,可通过将目标空间初始化为非0字符来验证:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char arr1[] = "hello world";
char arr2[15] = "xxxxxxxxxxxxxxx";
strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
调试监视arr数组各元素 :
2、目标空间必须足够大以接收源字符串,否则程序会报错:
3、目标空间内容必须可修改(常量字符串、const修饰的变量等均不可作为目标空间):
4. 模拟实现
4.1 第一版:基本功能+判空+const修饰
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
void my_strcpy1(char* dest, const char* src) {
assert(src != NULL);
assert(dest != NULL);
// 拷贝'\0'之前的内容
while (*src != '\0') {
*dest = *src;
src++;
dest++;
}
// 拷贝'\0'
*dest = *src;
}
int main() {
char arr1[] = "hello world";
char arr2[15] = { 0 };
my_strcpy1(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
4.2 第二版:优化对于'\0'的单独拷贝
#include<assert.h>
void my_strcpy2(char* dest, const char* src) {
assert(src != NULL);
assert(dest != NULL);
while (*dest++ = *src++) {
;
}
}
int main() {
char arr1[] = "hello world";
char arr2[15] = { 0 };
my_strcpy2(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
注:虽然++的优先级高于*,但由于为后置++,故*dest++实际上是对dest解引用后再++;
将*dest++ = *src++ 置于while判断条件中,由于判断条件需先执行后判断,
while (*dest++ = *src++) 写法既完成了\0的拷贝,也使得条件为假跳出循环;
4.3 第三版:仿strcpy的char*返回值
查strcpy文档,关于其参数及返回值介绍如下:
返回类型为char*,返回值为destination,即目标空间的起始地址;
cplusplus.com网址如下:
strcpy - C++ Referencehttps://legacy.cplusplus.com/reference/cstring/strcpy/?kw=strcpy现修改代码如下:
#include<stdio.h>
#include<assert.h>
char* my_strcpy3(char* dest, const char* src) {
assert(src != NULL);
assert(dest != NULL);
char* ret = dest;
while (*dest++ = *src++) {
;
}
return ret;
}
int main() {
char arr1[] = "hello world";
char arr2[15] = { 0 };
my_strcpy3(arr2, arr1);
printf("%s\n", arr2);
return 0;
}