C语言字符函数及其实现

strlen——计算'\0' 前面出现的字符个数

size_t strlen ( const char * str );
  1. 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 '\0' )
  2. 参数指向的字符串必须要以 '\0' 结束。
  3. 注意函数的返回值为size_t,是无符号的( 易错
int my_strlen(const char* arr)
{
    assert(arr);
	//1 计数
	int count = 0;
	while (*arr != '\0')
	{
		count++;
		arr++;
	}
	return count;
	//2 指针
	char* p = arr;
	while (*arr != '\0')
	{
		++arr;
	}
	return arr - p;
	//3 递归
	if(*arr!='\0')
	{
		return (1 + my_strlen(arr + 1 ));
	}
	return 0;
}

strcpy——拷贝

char* strcpy ( char * destination , const char * source );
  1. 源字符串必须以 '\0' 结束。
  2. 会将源字符串中的 '\0' 拷贝到目标空间。
  3. 目标空间必须足够大,以确保能存放源字符串。
  4. 目标空间必须可变。
char* my_strcpy(char* dst, const char* src)
{
	assert(dst && src);
	char* t = dst;
	while (*dst++ = *src++)
	{
		;
	}
	return t;
}

strcat——在字符串后面追加

char * strcat ( char * destination , const char * source );
  1.  源字符串必须以 '\0' 结束。
  2. 目标空间必须有足够的大,能容纳下源字符串的内容。
  3. 目标空间数据必须可修改。
  4. 字符串自己给自己追加,会出问题
char* my_strcat(char* dst, const char* src)
{
	assert(dst && src);
	char* p = dst;
	assert(dst && src);
	while (*dst)
	{
		dst++;
	}
	while (*dst++ = *src++)
	{
		;
	}
	return p;
}

strcmp——比较字符串的大小

int strcmp ( const char * str1, const char * str2 ); 

规定: 

  1. 第一个字符串大于第二个字符串,则返回大于0的数字
  2. 第一个字符串等于第二个字符串,则返回0
  3. 第一个字符串小于第二个字符串,则返回小于0的数字
int my_strcmp(const char* src1, const char* src2)
{
	assert(src1 && src2);
	while (*src1 == *src2)
	{
		if (*src1 == '\0')  return 0;
		src1++;
		src2++;
	}
	return *src1 - *src2;
}

strcat,strcmp,strcpy的长度不受限制,因此编译器认为他们不太安全。 

strstr——在字符串中匹配字符串

char * strstr ( const char * str1 , const char * str2 );

规定:

  1. 在str1中找字符串str2,找到就会返回字符在的地址
  2. 没有找到就返回NULL 
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
    //如果是空就直接返回
	if (*str2 == '\0') return str1;
    //设置三个指针
	const char* s1 = str1;
	const char* s2 = str2;
	const char* cp = str1;
	while (*cp)
	{//每次都要把cp赋值给s1,s2=str2
		s1 = cp;
		s2 = str2;
		while (*s1!='\0' && *s2!='\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		//当s2找完了,就返回cp
		if (*s2 == '\0') return cp;
		cp++;
	}
	return NULL;
}

strtok——分割字符串

char * strtok ( char * str , const char * sep );
  1. sep参数是个字符串,定义了用作分隔符的字符集合
  2. 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记。
  3. strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)
  4. strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。 ​​​​​​​
  5. strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。
  6. ​​​​​​​如果字符串中不存在更多的标记,则返回 NULL 指针。
使用方法
int main()
{
   char *p = "zhangpengwei@bitedu.tech";
   const char* sep = ".@";
   char arr[30];
   char *str = NULL;
   strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
   for(str=strtok(arr, sep); str != NULL; str=strtok(NULL, sep))
   {
     printf("%s\n", str);
   }
   return 0;
}

strerror——返回错误码所指的错误信息

char * strerror ( int errnum );

使用方法 

  printf ( "Error opening file unexist.ent: %s\n" , strerror ( errno ));
若是想要更方便,可以用perror(),直接打印错误信息。

​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/553510.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-笔记-06.数据高级查询

目录 6.1 连接查询 6.1.1 交叉连接(cross join) 6.1.2 内连接(inner join) 6.1.3 外连接(outer join) 6.1.3.1 左外连接(left [outer] join) 6.1.3.2 右外连接(rig…

第2章:车辆纵向控制

2.1 车辆纵向动力学模型 注:车辆的纵向控制是指控制车辆行驶方向上的加减速,使得汽车可以按照期望的速度行驶,并保持安全的前后车距(即对汽车油门 / 刹车的控制); 2.1.1 车辆纵向受力模型 :轮胎…

SpringBootSpringCloud升级可能会出现的问题

1.背景 之前负责过我们中台的SpringBoot和Cloud的升级,特次记录分享一下项目中可能出现的问题,方便后续的人快速定位问题。以及下述选择的解决方案都是基于让升级的服务影响和改动最小以及提供通用的解决方案的提前进行选择的。 1.1版本说明 升级前&a…

OpenCV基本图像处理操作(十)——图像特征harris角点

角点 角点是图像中的一个特征点,指的是两条边缘交叉的点,这样的点在图像中通常表示一个显著的几角。在计算机视觉和图像处理中,角点是重要的特征,因为它们通常是图像中信息丰富的区域,可以用于图像分析、对象识别、3D…

JavaSE中的String类

1.定义方式 常见的三种字符串构造 public class Test1 {public static void main(String[] args) {// 使用常量串构造String str1 "abc";System.out.println(str1);// 直接newString对象String str2 new String("ABC");System.out.println(str2);// 使用…

【Linux学习】Linux指令(四)

文章标题 🚀zip/unzip指令:🚀tar指令(重要):🚀uname –r指令:🚀关机指令🚀几个常用操作 🚀zip/unzip指令: zip 与 unzip的安装 yum i…

Day20-【Java SE高级】单元测试 反射 注解 动态代理

一、单元测试 就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。 1. 咱们之前是如何进行单元测试的?有啥问题? 只能在main方法编写测试代码,去调用其他方法进行测试。无法实现自动化测试,一个方法测试失败,可能…

学习在Debian系统上安装Shadowsocks教程

学习在Debian系统上安装Shadowsocks教程 安装shadowsocks-libev及其所需的依赖启动Shadowsocks服务:如果你想要通过代理本地流量,你可以使用ss-local:启动并设置ss-local:查看状态本地连接 安装shadowsocks-libev及其所需的依赖 …

量化交易为什么独宠Python

“我在学一门叫Python的语言”。“什么是Python,没听说过啊,为什么不学C啊”。这是发生在2014年,上海的一家量化基金,量化研究员和老板之间的对话。 “我想问一下关于Python的课程,什么时候能开班”。“Python啊&#…

数据结构-栈和队列刷题集(长期更新)

文章目录 万能计算器的实现以及源码分析1. leetcode 150 逆波兰表达式求值 万能计算器的实现以及源码分析 /*** 我们尝试写一个完整版的计算器,由于计算机不能很好的识别括号,所以一般要转换为逆波兰表达式求解* 思路解析 :* 1. 输入一个 中缀表达式* 2. 中缀表达式转化为list…

Python 数据结构和算法实用指南(一)

原文:zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者:飞龙 协议:CC BY-NC-SA 4.0 前言 数据结构和算法是信息技术和计算机科学工程学习中最重要的核心学科之一。本书旨在提供数据结构和算法的深入知识,以及编程…

28岁转行嵌入式适合转嵌入式吗?

转行到嵌入式领域是一个很好的选择,特别是如果你对电子技术、嵌入式系统和软硬件交互感兴趣的话。我这里有一套嵌入式入门教程,不仅包含了详细的视频 讲解,项目实战。如果你渴望学习嵌入式,不妨点个关注,给个评论222&a…

信息系统项目管理师0054:运维和服务(4信息系统管理—4.1管理方法—4.1.4运维和服务)

点击查看专栏目录 文章目录 4.1.4运维和服务1.运行管理和控制2.IT服务管理3.运行与监控4.终端侧管理5.程序库管理6.安全管理7.介质控制8.数据管理4.1.4运维和服务 信息系统的运维和服务应从信息系统运行的视角进行整合性的统筹规划,包括对信息系统、应用程序和基础设施的日常控…

C语言的OJ判题机设计与实现

1. 接收判题入参 判题需要作答代码、测试输入和期望输出、编译器名称、时空限制。对于支持special judge的还需要传入是否为sj和sj代码。推荐使用消息队列,应对高并发的比赛情况会比较好。 但是消息队列是异步的,我为了快点实现能提交后在当前页面获得判…

Elasticsearch:(一)ES简介

搜索引擎是什么?在不少开发者眼中,ES似乎就是搜索引擎的代名词,然而这实际上是一种误解。搜索引擎是一种专门用于从互联网中检索信息的技术工具,它主要可以划分为元搜索引擎、全文搜索引擎和垂直搜索引擎几大类。其中,…

AIGC算法1:Layer normalization

1. Layer Normalization μ E ( X ) ← 1 H ∑ i 1 n x i σ ← Var ⁡ ( x ) 1 H ∑ i 1 H ( x i − μ ) 2 ϵ y x − E ( x ) Var ⁡ ( X ) ϵ ⋅ γ β \begin{gathered}\muE(X) \leftarrow \frac{1}{H} \sum_{i1}^n x_i \\ \sigma \leftarrow \operatorname{Var}(…

【中级软件设计师】上午题08-UML(下):序列图、通信图、状态图、活动图、构件图、部署图

上午题08-UML 1 序列图2 通信图3 状态图3.1 状态和活动3.2 转换和事件 4 活动图5 构件图(组件图)6 部署图 【中级软件设计师】上午题08-UML(上):类图、对象图、用例图 UML图总和 静态建模:类图、对象图、用例图 动态建模&#xff…

【简单介绍下PostCSS】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

仿真测试的应用领域

仿真测试在各种领域中都有广泛的应用,以下是一些应用最广泛的场景: 工业制造:通过模拟制造过程,可以预测产品的质量和性能,优化生产流程,降低成本。航空航天:飞机、导弹、航天器等的设计和研发…

AWS Key disabler:AWS IAM用户访问密钥安全保护工具

关于AWS Key disabler AWS Key disabler是一款功能强大的AWS IAM用户访问密钥安全保护工具,该工具可以通过设置一个时间定量来禁用AWS IAM用户访问密钥,以此来降低旧访问密钥所带来的安全风险。 工具运行流程 AWS Key disabler本质上是一个Lambda函数&…