【C语言】_字符串拷贝函数strcpy

目录

[1. 函数声明及功能](#1. 函数声明及功能)

[2. 使用示例](#2. 使用示例)

[3. 注意事项](#3. 注意事项)

[4. 模拟实现](#4. 模拟实现)

[4.1 第一版:基本功能+判空+const修饰](#4.1 第一版:基本功能+判空+const修饰)

[4.2 第二版:优化对于'\0'的单独拷贝](#4.2 第二版:优化对于'\0'的单独拷贝)

[4.3 第三版:仿strcpy的char*返回值](#4.3 第三版:仿strcpy的char*返回值)


1. 函数声明及功能

cpp 复制代码
char * strcpy ( char * destination, const char * source );

strcpy功能:字符串拷贝

2. 使用示例

cpp 复制代码
#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字符来验证:

cpp 复制代码
#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修饰

cpp 复制代码
#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'的单独拷贝

cpp 复制代码
#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现修改代码如下:

cpp 复制代码
#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;
}
相关推荐
测试员周周14 分钟前
【AI测试功能5】AI功能测试的“黄金数据集“构建指南:从0到1搭建质量评估体系
运维·服务器·开发语言·人工智能·python·功能测试·集成测试
蓝眸少年CY23 分钟前
Scala - 基础教程
开发语言·后端·scala
MATLAB代码顾问29 分钟前
黏菌算法(SMA)原理详解与Python实现
开发语言·python·算法
salipopl31 分钟前
C/C++ 中 volatile 关键字详解:原理、作用与实际应用
开发语言·c++
AI人工智能+电脑小能手36 分钟前
【大白话说Java面试题】【Java基础篇】第39题:说说反射的用途及实现原理,Java获取反射(Class)的三种方法
java·开发语言·后端·python·面试
AIminminHu39 分钟前
(让 C++ 程序长出大脑:从“语音遥控器”到具身智能 Agent 的进化之路)------OpenGL渲染与几何内核那点事------(二-1-(15))
开发语言·c++·agent·具身智能
Project_Observer44 分钟前
使用Zoho Projects记录工时时间后自动更新项目预算。
开发语言·数据库·人工智能·深度学习·机器学习
hixiong1231 小时前
C#文件目录结构生成工具
开发语言·c#
小碗羊肉1 小时前
【JavaWeb | 第五篇】JDBC
java·开发语言·数据库
书源丶1 小时前
四十五、函数式接口与 Lambda 表达式
java·开发语言