经典笔试题(二):模拟实现strcpy,strcat,strcmp,strstr,memcpy

【C语言】特性描述及模拟实现strlen、strcpy、strcat、strchr、strstr、strcmp、memcpy、memmove 特性描述及模拟实现strlen、strcpy、strcat、strchr、strstr、strcmp、memcpy、memmove   在学习C语言的过程中,不可避免的会经常接触一些库函数,那么有没有小伙伴想过这些库函数怎么实现的呢?   往往这些库函数都是用最精炼最高效的方式写出的,观摩并模拟出库函数的实现,有利于我们对C语言的深入理解。   今天我将我总结的字符串操作函数及其对应的一些小... 阅读详情

直接上代码:

1.
//模拟实现strcpy
#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest ;
	assert(dest != NULL) ;
	assert(src != NULL) ;
	while(*src != '\0')
	{
		*dest = *src ;
		dest++ ;
		src++ ;
	}
	*dest = '\0' ;//手动地将最后的'\0'补上
	return ret ;
}

int main()
{
	char dest[1024] = "I am a" ;
	char src[1024] = "He is a student!" ;
	char* ret = NULL ;
	printf("----------模拟实现strcpy函数----------\n") ;
	printf("\n拷贝之前两个字符串分别为:\n") ;
	printf("%s\n", dest) ;
	printf("%s\n", src) ;
	ret = my_strcpy(dest, src) ;
	printf("\n拷贝之后字符串分别为:\n") ;
	printf("%s\n", dest) ;
	return 0 ;
}

运行结果:
在这里插入图片描述

2.
//模拟实现strcat
#include <stdio.h>
#include <assert.h>

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest ;//将目的字符串的起始位置先保存,等会要返回它的头指针
	//先找到dest的结束位置,再把src拷贝到dest中,记得在最后要加上'\0'
	assert(dest != NULL) ;
	assert(src != NULL) ;
	while(*dest != '\0')
	{
		dest++ ;
	}
	//此刻dest已经指向结束位置
	while(*src != '\0')
	{
		*dest = *src ;
		dest++ ;
		src++ ;
	}
	*dest = '\0' ; //记得在最后要加上'\0'结束标志
	return ret ;
}

int main()
{
	char dest[1024] = "I am a " ;
	char src[1024] = "student!" ;
	char* ret = NULL ;
	printf("----------模拟实现strcat函数----------\n") ;
	printf("\n拼接之前两个字符串分别为:\n") ;
	printf("%s\n", dest) ;
	printf("%s\n", src) ;
	ret = my_strcat(dest, src) ;
	printf("\n拼接之后字符串分别为:\n") ;
	printf("%s\n", dest) ;
	return 0 ;
}

运行结果:
在这里插入图片描述

3.
//模拟实现strcmp函数

#include <stdio.h>
#include <assert.h>

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 != NULL) ;
	assert(str2 != NULL) ;
	while(*str1 != '\0' && *str2 != '\0')
	{
		if(*str1 > *str2)
		{
			return 1 ;
		}
		else if(*str1 < *str2)
		{
			return -1 ;
		}
		else
		{
			str1++ ;
			str2++ ;
		}
	}
	if(*str1 < *str2)
	{
		return -1 ;
	}
	else if(*str1 > *str2)
	{
		return 1 ;
	}
	else
		return 0 ;
}

int main()
{
	char str1[1024] = "I am a student" ;
	char str2[1024] = "I am a student..." ;
	int ret = 0 ;
	printf("----------模拟实现strcmp函数----------\n") ;
	printf("\n比较之前两个字符串分别为:\n") ;
	printf("%s\n", str1) ;
	printf("%s\n", str2) ;
	ret = my_strcmp(str1, str2) ;
	printf("若返回-1,则str1 < str2\n") ;
	printf("若返回,则str1 > str2\n") ;
	printf("若返回,则str1 == str2\n") ;
	printf("\n比较之后结果为:\n") ;
	printf("%d\n", ret) ;
	return 0 ;
}

运行结果:
在这里插入图片描述

4.
//模拟实现strstr函数

#include <stdio.h>
#include <assert.h>




char* my_strstr(const char* str1, const char* str2)
{
	//在str1中尝试查找str2
	//例如,第一次,str1指向字符串起始位置,然后比较str1和str2
	char* cp = str1 ; //保存str1起始位置
    assert(str1 != '\0') ;
	assert(str2 != '\0') ;
	//若str2为空,则直接返回空
	if(*str2 == '\0')
	{
		return NULL ;
	}
	//若不为空,则进行查询
	while(*cp != '\0')
	{
		char* s1 = cp ;
		char* s2 = str2 ;
		while(*s1 != '\0' && *s2 != '\0' && *s1==*s2)
		{
			s1++ ;
			s2++ ;
		}

		//若s2先结束
		if(*s2 == '\0')
		{
			return str2 ;
		}
		//若s1先结束而s2还没结束,则返回空,例如在abcd 中查询bcde
		if(*s1 == '\0' && *s2 != '\0')
		{
			return NULL ;
		}

		cp++ ;
	}
	return NULL ;
}

int main()
{
	char str1[1024] = "hello world" ;
	char str2[1024] = " world hello" ;
	char* ret = NULL ;
	printf("----------模拟实现strstr函数----------\n") ;
	printf("\n匹配之前两个字符串分别为:\n") ;
	printf("str1 = %s\n", str1) ;
	printf("str2 = %s\n", str2) ;
	ret = my_strstr(str1, str2) ;
	printf("\n查询结果为: %s\n",ret) ;
	return 0 ;
}

运行结果:
在这里插入图片描述

5.
//模拟实现memcpy函数
#include <stdio.h>
#include <assert.h>

void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest ;
	size_t i = 0 ;
	assert(dest != NULL ) ;
	assert(src != NULL) ;

	for(i = 0; i<num; i++)
	{
		//因为void* 不能直接解引用,所以需要强转成char*再解引用
		//此处的void*实现了泛型编程
		*(char*) dest = *(char*) src ;
		dest = (char*)dest + 1 ;
		src = (char*) src + 1 ;
	}

	return ret ;
}

int main()
{
	char src[1024] = "My name is Romeo" ;
	char dest[1024] = {0} ;
	printf("----------模拟实现memcpy函数----------\n") ;
	printf("\n处理之前两个字符串分别为:\n") ;
	printf("str1 = %s\n", dest) ;
	printf("str2 = %s\n", src) ;
	my_memcpy(dest, src, sizeof(src)) ;
	printf("\n处理之后str1: %s\n", dest) ;
	return 0 ;
}

运行结果:
在这里插入图片描述

C语言模拟实现库函数strlen、strcpy、strcat、strcmp、strncpy、strncat、strncmp、strstr、strtok、memcpy、memmove、memcmp 注意:所有库函数头文件都是C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符,这里注意一点,再用sizeof求内存大小时会计算到'\0'下面是 strlen() 函数的声明。该函数返回字符串的长度。#include #include int is_prime_values_my_strlen(char* str) { //断言 assert(s 阅读详情

相关推荐

常用函数的实现strcpy,memcpy,memmove,strcat,strcmp原型

常用函数的实现strcpy,memcpy,memmove,strcat,strcmp原型

C字符串函数strcmp\strcpy\strcat\memcpy

1.strcmpint strcmp(const char* str1, const char*str2){ assert(str1 != NULL&&str2 != NULL); while (*str1&&*str1 == *str2){ str1++; str2++; } if (*(unsigned char*)str1 < *(

知之可否 3809

别再纠结了!手把手教你根据项目需求选对目标检测框架(MMDetection/Detectron2/YOLOv8实战对比)

本文详细对比了三大目标检测框架MMDetection、Detectron2和YOLOv8的适用场景与实战技巧,帮助开发者根据项目需求精准选型。从毕业设计到工业落地,分析不同场景下的核心需求与框架优势,提供决策树和避坑指南,确保技术选型与项目目标高度匹配。

weixin_30342209的博客 554

strcat,strcmp,memcpy,strcpy等函数的实现

1、Strcat函数原型如下 char *strcat(char *strDest, const char *strScr) //将源字符串加const,表明其为输入参数 { char * address = strDest; //该语句若放在assert之后,编译出错 assert((strDest != NULL) && (strScr != NULL));

dangercheng的专栏 1103

从圆形到椭圆:CenterNet中高斯热图半径的自适应优化策略

本文深入探讨了CenterNet目标检测模型中高斯热图生成策略的优化,针对传统圆形高斯核在处理长宽比差异大目标时的局限性,提出了自适应椭圆高斯核的解决方案。通过数学推导和代码实战,详细阐述了如何根据目标边界框尺寸动态计算椭圆长短轴半径,生成更贴合目标几何形状的热图监督信号,从而有效提升模型,尤其是对无人机、车辆等不规则目标的定位精度。

alice7model的博客 985

从零到一:3D-ResNet50在医学影像中的实战陷阱与避坑指南

本文深入探讨了3D-ResNet50在医学影像分类中的实战应用,重点解析了NIFTI数据预处理、小样本迁移学习陷阱及GPU显存优化等关键问题。通过分块加载、混合精度训练等技巧,有效解决了医学影像处理中的内存管理和性能挑战,为开发者提供了实用的避坑指南和优化策略。

weixin_29038345的博客 390

字符串操作函数Strcat、Strcpy、Strcmp、Strlen原型

1、Strcat函数原型如下: char *strcat(char *strDest, const char *strScr) //将源字符串加const,表明其为输入参数 {        char * address = strDest;             //该语句若放在assert之后,编译出错        assert((strDest != NULL) && (strS

Jfuck的专栏 1953

数据讲述中国故事!和鲸助力中国综合社会调查(CGSS)数据分析与可视化大赛圆满收官

用数据研究中国问题、总结中国道路、讲述中国故事。和鲸作为协办单位全程支持本次大赛,为中国人民大学中国调查与数据中心实施全套赛事系统,同时提供完备而周全的赛事运营服务。

ModelWhale的博客 1410

内存拷贝——strcpy,memcpy,strcat,strcmp,memmove

c/c++的强大和可怕之处在于其直接操作内存,c标准库提供了大量这样的函数,比如strcpy,strcat,memcpy等,写的时候要注意dst和src地址覆盖的问题,否则结果将不可期。还要注意一下异常输入。 strcpy函数 char* strcpy(char* dst,const char* src){ if(!dst || !src) return NULL; ...

慢慢冲鸭子的博客 895

专有钉钉小程序(浙政钉)开发搭建流程总览

最近公司有一个项目要做浙政钉,让我来负责做。靠,我一脸懵,开发了两年多不知道浙政钉是啥,感觉我眼界还是低了。然后就去百度、同事问了一圈才知道就是个钉钉小程序嘛,然后发布到浙政钉上了。就搭建项目跑起来我都肥了很多事,中间走了很多坑。正好领导让我写《钉钉小程序前端开发流程》,这想着也写个博客吧。下面就是整个流程及我所遇到的坑!

m0_53910290的博客 6356

YOLO11涨点优化:卷积魔改 | DCNv2升级版本,助力检测

在DCN的基础上,增加了2个创新点,分别是调制模块和使用多个调制后的DCN模块,从形成了DCN的升级版本——DCNv2

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 967

字符操作:strlen、strcpy、strcat、strcmp、strstr、strtok。内存操作:memset、memcpy、memmove。用法、细节、及部分模拟实现。

strlen的用法和细节、以及自己模拟实现的strlen。 strlen是对字符串大小求长度,只能用来求字符串的大小,可不能和sizeof混淆哦,strlen是一个函数,sizeof是一个操作符!具体细节,前面有文章讲了。 strlen求字符串的大小的时候,遇到\0就终止,但是\0不算在字符串长度里哦 举个例子: 下面三个是模拟实现的strlen。 assert函数是为了确保指针合法,不是野指针。 ```c #include <stdio.h> #include <windows.h&gt

Zhou000815的博客 4824

【QT开发教程】Qt中的跨平台文件系统操作

文件系统操作是应用程序开发中经常需要处理的任务。Qt提供了一套跨平台的文件系统操作API,使开发者能够在不同操作系统上无缝地进行文件和目录操作。本文将介绍Qt中的跨平台文件系统操作,包括基本概念、常用类和方法以及实际示例。

科技改变人类,技术成就未来 981

strcpy strcat strcmp strstr memset memcpy memmove 模拟实现

strcpy strcat strcmp strstr memset memcpy memmove函数的介绍及模拟实现

2301_82256131的博客 398

【硬刚Hadoop】HADOOP MAPREDUCE(1):概述

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Hadoop部分补充。 1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。 2MapReduce优缺点 2.1 优点 1)MapReduce易于编程 它简单的实现一些接口,就可以完成一个分布式程序..

微信搜:import_bigdata,大数据领域硬核原创作者 463

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C语言模拟实现strlen、strcpy、strcat、strstr、strcmp、memcpy、memmove

一、strlen函数 1.函数介绍 strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。 之前我在博客中写过关于数组运算中strlen和sizeof的区别,这里就不再多说了,附上连接:https://blog.youkuaiyun.com/...

cherrydreamsover的博客 651

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

模拟实现strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove

一、模拟strcpy //模拟strcpy #include<stdio.h> #include<stdlib.h> #include <assert.h> char *my_strcpy(char *dest, const char *src) { assert(dest != NULL); assert(src != NULL); char *re...

enemyfloggers的博客 213

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

模拟实现strcmp,strncmp,strstr,strcat,strncat,strcpy,strncpy,strlen ,memcpy,memmove等函数

1.模拟实现strlen函数 #include #include #include int my_strlen(const char *str)//循环 { int count  = 0; assert(str); while(*str)//遍历字符串,用计数器计数 { count++; str++; } return count; } int my_strlen(c

深海一诺 928

模拟实现C库函数strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove

1、模拟实现strcpy char *my_strcpy( char *dest, const char *str) { assert(dest != NULL); assert(str != NULL); while (*dest++=*str++) { ; } return dest; } int main() { char p[20]; char *p1 = "worl

ZoctopusD的博客 706

【关于库函数的模拟实现】——strlen,strcpy,strcmp,,strcat,strstr,memcpy,memmove

字符串操作函数是C语言中非常重要的函数,里面包括了指针的精华,同时对学习数据结构,如链表,数组,有非常好的练手方法。同时,知道内部实现,是基础中的基础。所以学习字符串操作函数是深入学C的必经之路。

weixin_73807021的博客 492

经典算法:模拟实现strcpy,strcmp,strcmp,strcat,strstr,memcpy

1.模拟strcpy 把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*,会覆盖原来的。 原型:char *strcpy(char* dest, const char *src); #include<iostream> #include <assert.h> using namespace std; char* my_strcpy(char ...

weixin_40535588的博客 153

strcpy,strcmp,strstr,strcat,memcpy,memmove,memset的模拟实现

模拟实现这些库函数,首先要了解他们的功能,接下来我带你去了解strcpy:功能:字符串拷贝,把源字符串src,拷贝到目标空间dest中要求:1.目标空间足够大,足够容得下src字符串。            2.目标字符串可修改,源字符串不能修改。            3.模拟实现strcpy返回值类型是char*,有返回值为了实现链式访问具体实现:把src中内容拷贝到dest中,直到拷贝过去s...

baidu_37964044的博客 311

模拟实现c库函数strcpy,strcat,strstr,strcmp,memcpy,memmove

目录 strcpy strcat strstr strcmp memcpy memmove strcpy strcpy是字符串复制函数,把从src(源字符串指针)地址开始且含有’\0’结束符的字符串复制到以dst(目的字符串指针)开始的地址空间。 注意:在进行复制时是连字符串结束标识符‘\0’一并复制。 只能拷贝字符串 char * My_strcpy(ch

Important_的博客 1222

C语言——模拟实现strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove函数

1.模拟实现strcpy strcpy,即string copy(字符串复制)的缩写。 strcpy是一种C语言的标准库函数,strcpy把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char*。 strcpy(dest,src)函数是把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间中,而且src和dest所指内存区域不可以重叠。这就要求dest必须有...

是胖胖没错了的博客 418

模拟实现strcpy、strcat、strstr、strchr、strcmp、memcpy、memmove函数

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<assert.h> #include<windows.h> 1.实现strcpy char*strcpy(char* dest, const char* src){ assert((d...

Walter-Brain博客空间 239

模拟实现strcpy、strcat、strstr、strcmp、memcpy、memmove、strchr

1.实现strcpy 2.实现strcat 3.实现strstr 4.实现strchr 5.实现strcmp 6.实现memcpy 7.实现memmove #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <...

qq_44783220的博客 199
上一篇: 我与代码的日常:C语言实现简易通讯录
下一篇: 我与代码的日常:逆转整数,回文字符串,回文数字,查询数组中遗漏数字,判断2的幂
Romeo  i
博客等级 码龄9年 151粉丝 80原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值