【C语言】c语言常用的几个函数源代码【strlen,strcpy,strcat,strstr】_csdn-[baotai]的博客-程序员宅基地_strstr源代码

技术标签: C语言  

【strlen】

函数说明:C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。

int my_strlen(const char *str)//测试字符字符串长度
{
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

int my_strlen1(const char *str)//应用递归测试字符串长度
{
	if (*str == '0')
		return 0;
	else
		return 1 + my_strlen1(str + 1);
}

int my_strlen2(const char *str)//利用两个指针分别指向字符串的头部和尾部,长度就是两指针之差
{
	char*p = str;
	while (*p != '\0')
	{
		p++;
	}
	return p - str;
}

【strcpy】

函数说明:C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest

char *my_strcpy(char *dest, const char*src)
{
	char *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);

	while ((*dest = *src))
	{
		dest++;
		src++;

	}
	return ret;//因为ret是char*类型的,所以返回值类型是char*类型的。
}

【strcat】

函数说明:C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。

char *my_strcat(char *dest, const char*src)//字符串拼接函数,将src拼接在dest后面,并且覆盖dest最后的\0.
{
	assert(dest!=NULL);
	assert(src!= NULL);
	char*ret = dest;
	while (*dest)
	{
		dest++;
	}
	while (*dest = *src)
	{
		dest++;
		src++;
	}
	return ret;
}

【strstr】

函数说明:C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。

char *my_strstr(const char *str1, const char*str2)//函数功能:判断str2是否为str1的子串,如果是则返回cp,如果不是则返回NULL.
{
	assert(str1);
	assert(str2);

	char *cp = (char*)str1;//
	char *substr = (char*)str2; //定义两个指针*cp, *substr的原因:由于str1, str2都是const修饰的,不能对其进行修改。
	char*s1 = NULL;
	
	if (*str2 == '/0')
		return NULL;
	while (*cp)
	{
		s1 = cp;
		substr = str2;
		if (*s1&&*substr && (*s1 == *substr));//判断字符串是否相等
		{
			s1++;
			substr++;
		}
		if (*substr == '/0')
		{
			return cp;
		}
		cp++;
	}
}

【strcmp】

函数说明:C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

参数

  • str1 -- 要进行比较的第一个字符串。
  • str2 -- 要进行比较的第二个字符串。

返回值

该函数返回值如下:

  • 如果返回值 < 0,则表示 str1 小于 str2。
  • 如果返回值 > 0,则表示 str2 小于 str1。
  • 如果返回值 = 0,则表示 str1 等于 str2。
int my_strcmp(const char *src, const char *dest)
{
	int ret;
	while ((ret = *(unsigned char *)src - *(unsigned char*)dest) && dest)
	{
		src++;
		dest++;
	}
		if (ret < 0)
			ret = -1;
		else if (ret>0)
			ret = 1;
		else if (ret = 0)
			ret = 0;
		return(ret);
}

【memcpy】

函数说明:C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字符到存储区 str1

void*memcpy(void*dest, const void*src, size_t count)//strcmp不会考虑其内存相互重叠的问题
{
	void*ret = dest;
	while (count--)
	{
		*(char*)dest = *(char*)src;//memcpy是按字节拷贝
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return(ret);
}

【memmove】

函数说明:C 库函数 void *memmove(void *str1, const void *str2, size_t n) 从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

void *memmove(void *dest, const*src, size_t count)
{
	void *ret = dest;
	
	if (dest <= src || (char*)dest >= ((char*)src + count))//dest和src的内存区域没有重叠的情况下
	{
		while (count--)
			*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	else//出现dest和src有内存区域重叠的情况
	{
		dest = (char*)dest + count - 1;
		src = (char*)dest + count - 1;
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest - 1;
			src = (char*)src - 1;
		}
	}
	return (ret);
}



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/csdn_baotai/article/details/80367169

智能推荐

ICPC 上海 2020 H Traveling in the Grid World_夜朔辰的博客-程序员宅基地

详细过程详见:ICPC2020上海赛区 Traveling in the Grid World对于等面积法,进行推导步骤展开:S=xy/2+(n−x)y+(m−y)(n−x)/2−nm/2=gcd(n,m)/2S=xy/2+ny−xy+nm/2−yn/2−xm/2+xy/2−nm/2=gcd(n,m)/2yn−xm=gcd(n,m)y=mx/n+gcd(n,m)/nS = xy / 2 +(n - x)y +(m - y)(n - x) / 2 - nm/ 2 = gcd(n, m)/2 \\S =

ViewPager Transform  使用详解_crianzy的博客-程序员宅基地

我们在使用Viewpager 的时候, 经常 会加入一些好看的滑动效果这个是怎么实现的呢?其实很简单,  google 以及为我提供了相应的方法.通过 setPageTransformer 就可以设置 Viewpager的滑动效果.Android 官方文档 已经提供了两种 滑动效果:http://developer.android.com/intl/zh-cn/traini

[绍棠] GPUImageMovieWriter 无法2次录像 报错:[AVAssetWriter startWriting] Cannot call method when status is 3_绍棠的博客-程序员宅基地

GPUImage官方的示例工程里有个SimpleVideoFilter,实时摄像头内容加上滤镜。然而这个工程写得非常简单,录像是自动启动的,录制10秒停止。研究一下代码,发现录制代码在-(void)viewDidLoad最后部分,2个dispatch_after调用。第一个dispatch_after开始录制,然后里面一层的dispatch_after停止录制并保存到手机相册。明确了功能就可以

Makefile文件编写_IT山IT水的博客-程序员宅基地

<br />      刚开始接触的差不多就是arm应用程序的编写,其中Makefile的编写至关重要,但是,感觉应用没前途,也就没兴趣了,就把精力投到内核与驱动学习,但是,没想到内核也要掌握Makefile,那就加紧学了,O(∩_∩)O~!<br />           Makefile文件中就有类似于C语言中宏定义的用法,用一个标识符来代替一个复杂的字符串,减少许多不必要的麻烦。Makefile中的变量的调用格式为:  $(变量)     <br />           Makefile书写的一般格

多媒体系统之音频的采集和播放(三)_Android-Alvin的博客-程序员宅基地

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680音频的采集和播放主要由专门的codec芯片完成,主流的codec芯片厂商有Circus Logic、Wolfson等。采集时codec芯片通过A/D采样把声音的模拟信号转换成数字信号并通过I2S总线送给CPU处理,播放时CPU把处理好的数字信号通过...

Tomcat和Servlet的学习笔记总结_ascto的博客-程序员宅基地

TomcatJavaWeb的概念什么是JavaWeb?JavaWeb是指通过Java语言编写可以通过浏览器访问的程序的总称。JavaWeb是基于请求和响应来开发的。请求是指:客户端给服务器发送数据,叫做请求Reques。响应是指:服务器给客户端回传数据,叫做响应response。请求与响应的关系?成对出现的,有请求就有响应。web资源的分类web资源按实现的技术和呈现的效果的不同,又分为静态资源和动态资源两种。静态资源:html,css,js,txt,mp4视频,jpg图片。动态资源:

随便推点

fso OpenTextFile 方法_gavinchengshubo的博客-程序员宅基地_fso.opentextfile

OpenTextFile 方法    语法:object.OpenTextFile(filename[, iomode[, create[, format]]])    作用:打开一个指定的文件并返回一个 TextStream 对象,该对象可用于对文件进行读、写、追加操作。    说明:    ·iomode 参数可为下面设置值中的任何值:    ForRead

java获取response对象_Java-Spring-获取Request,Response对象_五星天皇岩里政男的博客-程序员宅基地

第一种、参数@RequestMapping("/test")@ResponseBodypublicvoidsaveTest(HttpServletRequestreq,HttpServletResponseresp){}第二种、注解@AutowiredprivateHttpServletRequestrequest;第三种、上下文获取1、在web.xml配置监听器org.sprin...

Springboot与Redis的整合_超人欧迪伽的博客-程序员宅基地

概述本文内容主要关于spring-redis关于redis的key设计redis的基本数据结构介绍redis与springboot的整合sringboot中的redistemplate的使用关于spring-redisspring-data-redis针对jedis提供了如下功能:连接池自动管理,提供了一个高度封装的“RedisTemplate”类针对jedis客户端中...

在Linux上yum安装snmp,centos7配置安装snmp_缘定你的博客-程序员宅基地

1、安装snmp1、centos7+yum安装yum -y install net-snmp net-snmp-utils2、更改配置文件snmpd.confvi /etc/snmp/snmpd.conf添加社区为public,名为notConfigUser 重启(每次修改完配置文件都需要重启)systemctl restart snmpd3、测试1、查看tcp、udp端口开放netstat -t...

android studio打包以及gradle配置构建_披萨大叔的博客-程序员宅基地_android gradle打包没有配置文件

本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布通过浏览这篇文章,可以学习以下内容:生成签名文件手动打包通过配置自动打包隐藏签名文件敏感信息通过设置风味实现不同风味包的资源替换多渠道打包生成签名文件,手动打包首先生成签名文件,点击 Build -> Generate Signed APK:如果还没有签名文件,点击构造一个:图中圈住的三个地方是重要信息,其余随意填。

推荐文章

热门文章

相关标签