字符函数和字符串函数1

1、字符分类函数

C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。
这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h  

在这里介绍一下islower函数,其他的非常相似。

函数原型:

1 int islower(int c);
islower 是能够判断参数部分的 c 是否是⼩写字⺟的。
通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回 0。
练习:写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。
是小写返回非0,执行下面那条转大写(即ASCII码值-32)的语句。

2、字符转换函数

C语⾔提供了2个字符转换函数:
1 int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
2 int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
上⾯的代码,我们将⼩写转⼤写,是-32完成的效果,有了转换函数,就可以直接使⽤ toupper 
数。

3. strlen 的使⽤和模拟实现

1 size_t strlen ( const char * str );
字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包
'\0' )。
参数指向的字符串必须要以 '\0' 结束。
注意函数的返回值为 size_t,是⽆符号的( 易错 )
strlen的使⽤需要包含头⽂件<string.h>
学会strlen函数的模拟实现
两个size_t类型相减,即使得到一个负数也是一个无符号的整型。
10000000 00000000 00000000 00000011 -3的原码
11111111 11111111 11111111 11111101 -3的补码
内存中存的是补码,无符号整型直接将补码拿出来用,得到的是一个非常大的正数。

1、strlen函数的模拟实现

1、递归方式

2、计数器方式

3、指针-指针方式

4、strcpy的使用和模拟实现

函数原型:

1 char* strcpy(char * destination, const char * source );

函数作用:将源指向的C字符串复制到目标指向的数组中,包括终止的空字符(并在此时停止)。

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

1、strcpy的模拟实现

循环中把\0之前的字符全面放到src中,跳出循环再把\0放到src中,以此完成了strcpy的模拟实现。

也可以这样写,后置++先使用后++,先把src解引用赋给dest再++。最后要把\0赋值给dest后才停止循环。

也可以给函数设置返回值,以实现链式访问,使得代码书写更加灵活。

5. strcat 的使⽤和模拟实现

将源字符串的副本附加到目标字符串中。目标中的终止空字符将被源的第一个字符覆盖,并且在目标中两者的连接形成的新字符串的末尾包含一个空字符。
使用须知与目标:
源字符串必须以 '\0' 结束。
⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
⽬标空间必须可修改。
翻译一下工作流程:1、找到目标字符串的结尾\0
2、从\0的位置开始追加源头字符串中的数据
3、把源头数据拷贝过去,放在\0开始向后的位置
字符串⾃⼰给⾃⼰追加,如何?
不可以,因为dest中的\0已经被覆盖了,src无法遇到\0使得循环停止,会陷入死循环。

1、strcat的模拟实现

1、找到dest指向的字符串的\0

2、进行数据的拷贝(与strcpy的模拟实现一样)

6. strcmp 的使⽤和模拟实现

这个函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用往下对,直到字符不同或达到终止的空字符。

标准规定:
第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩

1、strcmp的模拟实现

7. strncpy 函数的使⽤

函数原型:

​1 char * strncpy ( char * destination, const char * source, size_t num );​
拷⻉num个字符从源字符串到⽬标空间。
如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。
追加字符之后还会放置一个\0。

8. strncat 函数的使⽤

函数原型:

1 char * strncat ( char * destination,const char* source,size_t num);
将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字符
如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。

9. strncmp函数的使⽤

函数原型:

1 int strncmp ( const char * str1, const char * str2, size_t num );
⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。

10. strstr 的使⽤和模拟实现

函数原型:

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

在str1中查找str2这个字符串,第一次出现的位置,如果找到了,则返回起始地址,如果找不到则返回NULL。

1、strstr的模拟实现

​
#include <stdio.h>char* my_strstr(const char* str1, const char* str2) {// 如果 str2 是空字符串,直接返回 str1 的起始地址if (*str2 == '\0') {return (char*)str1;}const char* s1 = NULL;const char* s2 = NULL;const char* cur = str1;while (*cur) {s1 = cur;s2 = str2;// 同时遍历 s1 和 s2,比较对应字符是否相等while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) {s1++;s2++;}// 如果 s2 到达字符串结尾,说明找到了 str2if (*s2 == '\0') {return (char*)cur;}// 未找到,继续检查下一个位置cur++;}// 遍历完 str1 都未找到 str2,返回 NULLreturn NULL;
}​
char* my_strstr(const char* str1, const char* str2)
{// cp 用于遍历 str1,从 str1 的起始位置开始char* cp = (char*)str1;char* s1, * s2;// 如果 str2 是空字符串,直接返回 str1 的起始地址if (!*str2)return((char*)str1);// 遍历 str1,直到遇到字符串结束符 '\0'while (*cp){// s1 指向当前 cp 所指向的位置s1 = cp;// s2 指向 str2 的起始位置s2 = (char*)str2;// 同时遍历 s1 和 s2,比较对应字符是否相等// 只要 s1、s2 都未到字符串结尾且对应字符相等,就继续比较while (*s1 && *s2 && !(*s1 - *s2))s1++, s2++;// 如果 s2 到达字符串结尾,说明找到了 str2if (!*s2)return(cp);// 如果未找到,cp 指向下一个字符,继续查找cp++;}// 如果遍历完 str1 都未找到 str2,返回 NULLreturn(NULL);
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法系列之排序算法-堆排序

在数据结构中&#xff0c;堆&#xff08;Heap&#xff09;是一种特殊的树形数据结构&#xff0c;通常用于实现优先队列。堆分为最大堆和最小堆两种类型。最大堆的每个节点的值都大于或等于其子节点的值&#xff0c;而最小堆的每个节点的值都小于或等于其子节点的值。Java 提供了…

Mercury、LLaDA 扩散大语言模型

LLaDA 参考&#xff1a; https://github.com/ML-GSAI/LLaDA https://ml-gsai.github.io/LLaDA-demo/ 在线demo&#xff1a; https://huggingface.co/spaces/multimodalart/LLaDA Mercury 在线demo&#xff1a; https://chat.inceptionlabs.ai/ 速度很快生成

YOLO - pose detect 输入输出接口与执行效率测试

0.参考资料&#xff1a; Pose - Ultralytics YOLO Docs 下面仅对这个模型的输入输出接口和效率做了判断&#xff0c;尚不涉及训练。 pose和segment 相对class detect是相对自然的扩展。object box内部的 subclass就是seg&#xff0c;object box 内部的point array 就是Pose。…

DeepSeek 开源狂欢周(一)FlashMLA:高效推理加速新时代

上周末&#xff0c;DeepSeek在X平台&#xff08;Twitter&#xff09;宣布将开启连续一周的开源&#xff0c;整个开源社区为之沸腾&#xff0c;全球AI爱好者纷纷为关注。没错&#xff0c;这是一场由DeepSeek引领的开源盛宴&#xff0c;推翻了传统推理加速的种种限制。这周一&…

MySQL数据库基本概念

目录 什么是数据库 从软件角度出发 从网络角度出发 MySQL数据库的client端和sever端进程 mysql的client端进程连接sever端进程 mysql配置文件 MySql存储引擎 MySQL的sql语句的分类 数据库 库的操作 创建数据库 不同校验规则对查询的数据的影响 不区分大小写 区…

【洛谷贪心算法】P1106删数问题

这道题可以使用贪心算法来解决&#xff0c;核心思路是尽量让高位的数字尽可能小。当我们逐步删除数字时&#xff0c;会优先删除高位中相对较大的数字。具体做法是从左到右遍历数字序列&#xff0c;当发现当前数字比它后面的数字大时&#xff0c;就删除当前数字&#xff0c;直到…

【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目

解决idea至少创建jdk17项目 问题 idea现在只能创建最少jdk17&#xff0c;不能创建java8了吗?解决 问题 idea现在只能创建最少jdk17&#xff0c;不能创建java8了吗 我本来以为是 IDEA 版本更新导致的 Bug&#xff0c;开始还没在意。 直到我今天自己初始化项目时才发现&am…

MyBatis 操作数据库(详细入门详细)

本章⽬标 1. 使⽤MyBatis完成简单的增删改查操作, 参数传递. 2. 掌握MyBatis的两种写法: 注解 和 XML⽅式 3. 掌握MyBatis 相关的⽇志配置 铺垫 在应⽤分层学习时, 我们了解到web应⽤程序⼀般分为三层&#xff0c;即&#xff1a;Controller、Service、Dao . 之前的案例中…

C# 基于.NET Framework框架WPF应用程序-MQTTNet库实现MQTT消息订阅发布

C# 基于.NET Framework框架WPF应用程序-MQTTNet库实现MQTT消息订阅发布 MQTT简述MQTTNet简述创建项目&#xff08;基于.NET Framework框架&#xff09;安装MQTTNet库项目源码运行效果 MQTT简述 mqtt官网 MQTTNet简述 MQTTnet MQTTnet 是一个强大的开源 MQTT 客户端库&#…

武汉大学生命科学学院与谱度众合(武汉)生命科技有限公司举行校企联培座谈会

2025年2月21日下午&#xff0c;武汉大学生命科学学院与谱度众合&#xff08;武汉&#xff09;生命科技有限公司&#xff08;以下简称“谱度众合”&#xff09;在学院学术厅举行校企联培专业学位研究生合作交流会。武汉大学生命科学学院副院长刘星教授、生命科学学院周宇教授、产…

【JSON2WEB】15 银河麒麟操作系统下部署JSON2WEB

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

Redis 持久化方式:RDB(Redis Database)和 AOF(Append Only File)

本部分内容是关于博主在学习 Redis 时关于持久化部分的记录&#xff0c;介绍了 RDB 和 AOF 两种持久化方式&#xff0c;详细介绍了持久化的原理、配置、使用方式、优缺点和使用场景。并对两种持久化方式做了对比。文章最后介绍了 Redis 持久化的意义并与其他常见的缓存技术做了…

华为云之使用鲲鹏弹性云服务器部署Node.js环境【玩转华为云】

华为云之使用鲲鹏弹性云服务器部署Node.js环境【玩转华为云】 一、本次实践介绍1.1 实践环境简介1.3 本次实践完成目标 二、 相关服务介绍2.1 华为云ECS云服务器介绍2.2 Node.js介绍 三、环境准备工作3.1 预置实验环境3.2 查看预置环境信息 四、登录华为云4.1 登录华为云4.2 查…

《Python实战进阶》No 7: 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战

第7集&#xff1a; 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战 在现代 Web 开发中&#xff0c;实时通信已经成为许多应用的核心需求。无论是聊天应用、股票行情推送&#xff0c;还是多人协作工具&#xff0c;WebSocket 都是实现高效实时通信的最佳选择之一。本…

(转)Java单例模式(1)

l单例模式的好多&#xff1a;节约了内存&#xff0c;提高了代码的执行效率。

【PCIe 总线及设备入门学习专栏 1.2 -- 访问 PCIe 设备过程】

文章目录 OverviewPCIe 系统软件层次TLP 通用格式配置过程PCIe 设备配置寄存器Type0 Configuration Request配置过程Overview 对于PCIe 设备来说,它与桥的连接直通过两条差分信号,那么当桥下面接入多个PCIe 设备时,它是如何选中某个设备的呢?我面前面一篇文件介绍了 PCI设…

HarmonyOS NEXT组件深度全解:十大核心组件开发指南与实战

文章目录 引言&#xff1a;组件化开发的未来趋势第一章&#xff1a;基础UI组件精要1.1 Button&#xff1a;交互设计的基石1.1.1 多态按钮实现1.1.2 高级特性 1.2 Text&#xff1a;文字渲染的进阶技巧1.2.1 富文本混排1.2.2 性能优化 第二章&#xff1a;布局组件深度解析2.1 Fle…

win11编译pytorch cuda128版本流程

Geforce 50xx系显卡最低支持cuda128&#xff0c;torch cu128 release版本目前还没有释放&#xff0c;所以自己基于2.6.0源码自己编译wheel包。 1. 前置条件 1. 使用visual studio installer 安装visual studio 2022&#xff0c;工作负荷选择【使用c的桌面开发】,安装完成后将…

log4j2中<logger>中没有指定appender的输出

一 优先级 1.1 规则 1.如果一个 <logger> 没有显式配置 appender&#xff0c;Log4j2 会将该日志事件传递给其 父 Logger 的 appender。 2.这种传递行为会一直向上追溯&#xff0c;直到找到配置了 appender 的 Logger&#xff0c;或者到达 Root Logger。 3.如果日志事…

【MySQL】(1) 数据库基础

一、什么是数据库 数据库自行选择了合适的数据结构来组织数据&#xff0c;方便用户写入&#xff08;存储介质&#xff0c;如硬盘&#xff0c;机器断电不会丢失数据&#xff09;和查询数据。在数据结构部分&#xff0c;我们讲到的 ArrayList、HashMap 集合类对象也能存储数据&am…