当前位置: 首页 > article >正文

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

目录

1. 函数声明及功能

2. 使用示例

3. 注意事项

4. 模拟实现

4.1 第一版:基本功能+判空+const修饰

4.2 第二版:优化对于'\0'的单独拷贝

4.3 第三版:仿strcpy的char*返回值


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++ Referenceicon-default.png?t=O83Ahttps://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;
}


http://www.kler.cn/a/504799.html

相关文章:

  • 实现nacos配置修改后无需重启服务--使用@RefreshScope注解
  • 【MySQL】MVCC详解, 图文并茂简单易懂
  • Redis复制(replica)
  • 游戏市场成果及趋势
  • C++复习
  • Winforms开发基础之非主线程操作UI控件的误区
  • BERT的中文问答系统62
  • postgresql分区表相关问题处理
  • Ansys Material Designer 简介
  • 【Leetcode 热题 100】739. 每日温度
  • 学习华为熵减:激发组织活力(系列之三)
  • Mac 删除ABC 输入法
  • candb++ windows11运行报错,找不到mfc140.dll
  • vscode离线安装插件--终极解决方案
  • 批量为视频生成字幕
  • 测试模型安全的手段
  • 突破跨境电商瓶颈:亚矩阵云手机应用全解析
  • RabbitMQ---消息确认和持久化
  • lanqiaoOJ 3333:肖恩的排序 ← 双指针+排序(从大到小)
  • mock服务-通过json定义接口自动实现mock服务
  • Python在WRF模型自动化运行及前后处理中实践技术应用-包括数据处理、模型运行、结果可视化等步骤。
  • 72_List列表原理
  • 计算机组成原理简答题、名词解释整理(考研、期末)
  • Android Perfetto 系列
  • Python 在企业级应用中的两大硬伤
  • 极客说|Azure AI Agent Service 结合 AutoGen/Semantic Kernel 构建多智能体解决⽅案