【c语言】字符函数和字符串函数(上)

news2024/10/2 8:42:36

前言

在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数~

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~


目录

前言

1. 字符分类函数 

例:字母大小分类

例:字母大小写转换

字符串相关函数

strlen的函数使用和模拟实现

strlen的函数使用

strlen的模拟实现

法1

法2

法3:递归

strcpy的函数使用和模拟实现

strcpy的函数使用

strcpy的模拟实现

不返回

优化

返回目标空间的起始地址

strcat的函数使用和模拟实现

strcat的函数使用

strcat的模拟实现

strcmp的函数使用和模拟实现

strcmp的函数使用

 strcmp的模拟实现


1. 字符分类函数 

 C语⾔中有⼀系列的函数是专⻔做字符分类的,使⽤这些函数需要包含的头⽂件是 ctype.h

例:字母大小分类

判断大小写

例:字母大小写转换

大写转小写

字符串相关函数

字符串相关函数要包含头文件string.h

strlen的函数使用和模拟实现

strlen的函数使用

用于计算字符串的个数

  • strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含 '\0' )。
  • 参数指向的字符串必须要以 '\0' 结束。
  • 注意函数的返回值为size_t,是⽆符号的

strlen的模拟实现

法1
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char*str)
{
	size_t count = 0;
	//断言str不为空指针
	assert(str != NULL);
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[] = "abcdef";
	size_t len = my_strlen(arr);
	printf("%zd\n", len);
	return 0;
}
法2
#include<stdio.h>
#include<assert.h>

//strlen的模拟实现
size_t my_strlen2(char* str)
{
	assert(str != NULL);
	char* start = str;
	while (*str)
	{
		str++;
	}
	return str - start;
}
法3:递归
size_t my_strlen3(char* str)
{
	assert(str != NULL);
	if (*str)
	{
		return 1+my_strlen3(str+1);
	}
	else
	{
		return 0;
	}
}

strcpy的函数使用和模拟实现

strcpy的函数使用

用于拷贝字符串

  •  源字符串必须以 '\0' 结束。
  •  会将源字符串中的 '\0' 拷⻉到⽬标空间
  • ⽬标空间必须⾜够⼤,以确保能存放源字符串。
  • ⽬标空间必须可修改

strcpy的模拟实现

不返回
#include<stdio.h>
void my_strcpy(char* dest, const char* src)
{
	while (*src)//遇到\0就停下,跳出while循环
	{
        assert(dest != NULL);
	    assert(src != NULL);
		//一个个字节从头开始拷贝
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;//最后把\0拷贝过去
}
int main()
{
	char arr1[20] = "xxxxxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}
优化
#include<stdio.h>
//优化
void my_strcpy(char* dest, const char* src)
{
    //若有一个为空指针,assert即为假
    assert(dest &&src);
	//先赋值(拷贝)地址再++
	//最后\0拷贝过去后,整个表达式为0,跳出循环
	while (*dest++=*src++)
	{
		;//空语句
	}
}
返回目标空间的起始地址
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);//若有一个为空指针,assert即为假
	//先赋值(拷贝)地址再++
	//最后\0拷贝过去后,整个表达式为0,跳出循环
	char* ret = dest;//保留目标空间的起始位置
	while (*dest++=*src++)
	{
		;//空语句
	}
	return ret;
}

strcat的函数使用和模拟实现

strcat的函数使用

用于追加字符串

  • 源字符串必须以 '\0' 结束。
  • ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
  • ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
  • ⽬标空间必须可修改。

strcat的模拟实现

注意:以下实现的my_strcat函数不可以自我追加,\0会被覆盖,造成死循环(越界访问)

#include<stdio.h>
#include<assert.h>
void my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	//保留目标空间的起始位置
	char* ret = dest;
	//1.找到目标空间的\0
	while (*dest)
	{
		dest++;
	}
	//2.在dest后面拷贝src的内容
	while (*dest++ = *src++)
	{
		;
	}
 }
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

strcmp的函数使用和模拟实现

strcmp的函数使用

用于字符串比较,⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩,(不是比长度)

第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字

第⼀个字符串等于第⼆个字符串,则返回0

第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

 strcmp的模拟实现

#include<stdio.h>
int my_strcmp(const char* s1, const char* s2)
{
	while (*s1 == *s2)
	{
		if (*s1 == '\0')
			return 0;
		s1++;
		s2++;
	}
	//return *s1-s2;
	if (*s1 > *s2)
		return 1;
	else
		return -1;
}

int main()
{
	int ret = my_strcmp("abcdefg", "abcdefg");
	printf("%d\n", ret);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录刷题第43天

第一题是最后一块石头的重量IIhttps://leetcode.cn/problems/last-stone-weight-ii/&#xff0c;没啥思路&#xff0c;直接上题解了。本题可以看作将一堆石头尽可能分成两份重量相似的石头&#xff0c;于是问题转化为如何合理取石头&#xff0c;使其装满容量为石头总重量一半的…

DataSpell 2023:专注于数据,加速您的数据科学之旅 mac/win版

JetBrains DataSpell 2023是一款专为数据科学家和数据分析师设计的集成开发环境&#xff08;IDE&#xff09;。这款IDE提供了强大的数据分析和可视化工具&#xff0c;旨在帮助用户更快速、更高效地进行数据科学工作。 DataSpell 2023软件获取 DataSpell 2023在保持其一贯的数…

【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示

学习《OpenCV应用开发&#xff1a;入门、进阶与工程化实践》一书 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; OpenCV开发痛点 传统图像算法开发最好的开源解决方案是OpenCV视觉库&#xff0c;但是OpenCV中收录了2000的传统算法&#xf…

SpringMVC 学习(七)之报文信息转换器 HttpMessageConverter

目录 1 HttpMessageConverter 介绍 2 RequestBody 注解 3 ResponseBody 注解 4 RequestEntity 5 ResponseEntity 6 RestController 注解 1 HttpMessageConverter 介绍 HttpMessageConverter 报文信息转换器&#xff0c;将请求报文&#xff08;如JSON、XML、HTML等&#x…

【Java EE初阶二十三】servlet的简单理解

1. 初识servlet Servlet 是一个比较古老的编写网站的方式&#xff0c;早起Java 编写网站,主要使用 Servlet 的方式&#xff0c;后来 Java 中产生了一个Spring(一套框架)&#xff0c;Spring 又是针对 Servlet 进行了进一步封装,从而让我们编写网站变的更简单了&#xff1b;Sprin…

打造自己的AIGC应用(一)入门篇

其实细数AI的发展历程非常之久&#xff0c;而让AI的应用一下子出现在人们眼前的其实就是ChatGPT的出现&#xff0c;这意味着AIGC应用已经从概念为王变的非常实用了。伴随着ChatGPT的出现&#xff0c;大量的开源大模型也如雨后春笋一样出现。就现在而言&#xff0c;打造一个自己…

49 kmalloc 的实现

前言 这里说的是 内核中分配小对象的一种内存分配方式 kmalloc 呵呵 经典程度不必多说了, 内核使用的大多数 不经常使用的小对象基本上是基于 kmalloc 这里 我们来看一下 kmalloc, kmalloc 基于 slab, 因此 这里不会赘述太多 如何分配对象 kmalloc 是系统中分配小空间…

面试题JS篇

目录 Js 基本数据类型有哪些Ajax 如何使用如何判断一个数据是 NaN&#xff1f;Js 中 null 与 undefined 区别闭包是什么&#xff1f;有什么特性&#xff1f;对页面会有什么影响JS中模块化的方法Js 中常见的内存泄漏什么是事件冒泡&#xff1f;事件委托是什么&#xff1f;如何确…

Arduino中安装ESP32网络抽风无法下载 暴力解决办法 python

不知道什么仙人设计的arduino连接网络部分&#xff0c;死活下不下来。&#xff08;真的沙口&#xff0c;第一次看到这么抽风的下载口&#xff09; 操作 给爷惹火了我踏马解析json选zip直接全部下下来 把这个大家的开发板管理地址下下来跟后面python放在同一目录下&#xff0c…

redis——客户端

Redis是一个典型一对多服务器程序&#xff0c;一个服务器可以与多个客户端进行网络连接&#xff0c;每隔客户端可以向服务器发送命令请求&#xff0c;而服务器则接收并处理客户端发送的命令请求&#xff0c;并向客户端返回命令请求。 通过是一个I/O多路复用技术实现的文件事件处…

09 Redis之分布式系统(数据分区算法 + 系统搭建与集群操作)

6 分布式系统 Redis 分布式系统&#xff0c;官方称为 Redis Cluster&#xff0c;Redis 集群&#xff0c;其是 Redis 3.0 开始推出的分布式解决方案。其可以很好地解决不同 Redis 节点存放不同数据&#xff0c;并将用户请求方便地路由到不同 Redis 的问题。 什么是分布式系统?…

blender bvh显示关节名称

导入bvh&#xff0c;菜单选择布局&#xff0c;右边出现属性窗口&#xff0c; 在下图红色框依次点击选中&#xff0c;就可以查看bvh关节名称了。

如何保证档案室符合建设标准要求

保证档案室符合建设标准要求需要考虑以下几个方面&#xff1a; 1. 总体规划&#xff1a;合理规划档案室的布局和大小&#xff0c;确保能够满足现有和未来的档案存储需求。考虑档案室的空间利用率、通风、照明、安全出口等因素。 2. 档案室环境&#xff1a;档案室的环境应具备稳…

SQL Server 开发环境配置教程(SSMS+SQL Prompt)

背景 记录一下 SQL Server 常用开发软件 体验了各种数据库IDE(DBeaver、Navicat、DataGrip)之后综合下来还是感觉 SSMSSQL Prompt 对于 SQL Server 最好用&#xff0c;所以在此记录一下配置过程 数据库可视化管理工具SSMS 官方下载地址&#xff1a; https://learn.microsoft…

【Java程序设计】【C00317】基于Springboot的智慧社区居家养老健康管理系统(有论文)

基于Springboot的智慧社区居家养老健康管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的智慧社区居家养老健康管理系统设计与实现&#xff0c;本系统有管理员、社区工作人员、医生以及家属四种角色权限 管…

01|Mysql底层存储引擎

1. 聚集索引&#xff08;聚簇&#xff09;与非聚集索引 1.1 聚集索引 索引和数据存储在一起。叶子节点存储了完整的数据记录&#xff1b; 1.2 非聚集索引 MyISAM存储引擎就是非聚集索引&#xff0c;索引和数据文件是分开存储的。索引在MYI文件中&#xff0c;数据在MYD文件中…

Zoho ToDo 满足您的需求:任务管理满足隐私和安全要求

任务管理工具已经成为我们日常生活中不可或缺的一部分&#xff0c;它们帮助我们处理各种事务&#xff0c;从杂项和愿望清单到管理截止日期和资源。这些工具不仅仅是简单的任务列表&#xff0c;它们掌握了项目的蓝图、雄心勃勃的目标和完成的最后期限。然而随着这些工具的使用越…

装配制造业的MES系统种的物料齐套技术

装配是制造企业涉及产品生产加工最为普遍的一种模式&#xff0c;包括汽车、电子、电器、电气等行业。经研究表明&#xff0c;装配在整个产品制造总成本中所占比例超过了50%&#xff0c;所占用的总生产时间比例在40%-60%&#xff0c;直接影响着产品质量和成本。装配制造非常强调…

Arduino单片机基础介绍

&#xff08;本文为简单介绍&#xff0c;内容源于网络和AI&#xff09; Arduino单片机&#xff0c;自2005年诞生以来&#xff0c;已经成为全球爱好者和专业工程师们快速实现创意原型的重要工具。Arduino的普及不仅因其强大的功能和简易的操作&#xff0c;还在于其背后强大的社…

websocket入门及应用

websocket When to use a HTTP call instead of a WebSocket (or HTTP 2.0) WebSocket 是基于TCP/IP协议&#xff0c;独立于HTTP协议的通信协议。WebSocket 是双向通讯&#xff0c;有状态&#xff0c;客户端一&#xff08;多&#xff09;个与服务端一&#xff08;多&#xff09…