当前位置: 首页 > article >正文

【C语言字符函数和字符串函数(一)】--字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现

目录

 一.字符分类函数

1.1--字符分类函数的理解

1.2--字符分类函数的使用

 二.字符转换函数

2.1--字符转换函数的理解

2.2--字符转换函数的使用 

三.strlen的使用和模拟实现

3.1--strlen的使用演示

3.2--strlen的返回值

 3.3--strlen的模拟实现

 四.strcpy的使用和模拟实现

4.1--strcpy的使用演示

4.2--strcpy的模拟实现

五.strcat的使用和模拟实现

5.1--strcat的使用演示 

5.2--strcat的模拟实现 


🔥个人主页:@草莓熊Lotso的个人主页

🎬作者简介:C++研发方向学习者

📖个人专栏:《C语言》

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。 


 一.字符分类函数

1.1--字符分类函数的理解

--C语言中有一系列函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。

这些函数的使用都需要包含头文件ctype.h

1.2--字符分类函数的使用

这些函数的使用方法十分类似,在这里以一个函数为例,其它的都很类似:

1. int islower ( int c ); 

islower是用来判断参数部分的C是不是大小写的,通过返回值来说明是不是小写字母,如果是就返回非零整数,如果不是就返回0;

练习:

 写一个代码,将字符串中的小写字符全部转为大写,其它字符不变。

#include<stdio.h>
#include<ctype.h>
int main()
{int i = 0;char arr[] = "I am a GENIUS";while (arr[i]){if (islower(arr[i]))arr[i] -= 32;//小写字母和大写字母的Ascll码值差32printf("%c", arr[i]);i++;}return 0;
}

 二.字符转换函数

2.1--字符转换函数的理解

--C语言提供了2个字符转换函数:(也需要包含头文件ctype.h)

1. int tolower ( int c ); //将参数传进去的大写字母转小写

2. int toupper ( int c ); //将参数传进去的小写字母转大写

上面我们将小写转大写,是利用了小写字母和大写字母的Ascll码值差32的性质,有了转换函数,就可以直接使用toupper函数实现小写转大写了。

2.2--字符转换函数的使用 

练习:

 写一个代码,利用字符转换函数将字符串中的小写字符全部转为大写,其它字符不变。

#include<stdio.h>
#include<ctype.h>
int main()
{int i = 0;char arr[] = "I am a GENIUS";while (arr[i]){if (islower(arr[i]))arr[i]=toupper(arr[i]);printf("%c", arr[i]);i++;}return 0;
}

三.strlen的使用和模拟实现

1. size_t strlen ( const char  *  str );

功能:统计参数str指向的字符串的长度,统计的是字符串中 '\0' 之前的字符的个数。

参数:str指针,指向了要统计长度的字符串。

返回值:返回了str指向的字符串的长度,返回的长度不会是负数,所以返回类型是size_t。

3.1--strlen的使用演示

#include<stdio.h>
#include<string.h>int main()
{const char* str = "abcdef";printf("%zd\n", strlen(str));//6return 0;
}

使用注意事项:

  •  字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包
  • '\0' )。
  • 参数指向的字符串必须要以 '\0' 结束。
  • 注意函数的返回值为 size_t,是无符号的( 易错 )
  • strlen的使用需要包含头文件<string.h>

3.2--strlen的返回值

 --strlen函数的返回值为 size_t,是无符号的( 易错 ),那为什么说它易错呢,我们来通过一串代码直观了解一下吧

#include <stdio.h>
#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if (strlen(str2) - strlen(str1) > 0){printf("str2>str1\n");}else{printf("srt2<str1\n");}return 0;
}

错误理解:按一般的想法来说,strlen(str2)-strlen(str1)应该是-3,小于0,所以打印srt2<str1,但是其实不是,我们来看看运行的结果: 

我们会发现结果是str2>str1,这正是因为strlen函数的返回类型是size_t类型,始终大于0,strlen(str2)-strlen(str1)的结果也是size_t类型的,所以也是大于0,直接打印出str2>str1。不过改成strlen(str2)>strlen(str1)就会打印出srt2<str1了。当然也有别的理解方法,这里就不多讲了。

 3.3--strlen的模拟实现

方法1:

//用计数器的方法
#include<stdio.h>
#include<assert.h>
size_t mystrlen(const char* str)
{int count = 0;assert(str!=NULL);while (*str){count++;str++;}return count;
}
int main()
{char arr[] = "abcdef";size_t ret = mystrlen(arr);printf("%d", ret);return 0;
}

方法2:

//用指针减指针
#include<stdio.h>
#include<assert.h>
size_t mystrlen(char* str)
{assert(str != NULL);char* p = str;while (*p){p++;}return p - str;}
int main()
{char arr[] = "abcdef";size_t ret = mystrlen(arr);printf("%d", ret);return 0;
}

方法三:

//不创建临时变量,用递归做
#include<stdio.h>
#include<assert.h>
size_t mystrlen(const char* str)
{assert(str != NULL);if (*str == '\0'){return 0;}else{return 1 + mystrlen(str + 1);}}
int main()
{char arr[] = "abcdef";size_t ret = mystrlen(arr);printf("%d", ret);return 0;
}

 四.strcpy的使用和模拟实现

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

功能:字符串拷贝,将源头的字符串拷贝到目标空间中,拷贝到源头字符串中的 '\0' 为止。

参数: destination指针,指向目的地空间;source指针,指向源头数据。

返回值:strcpy函数返回的目标空间的起始地址。

4.1--strcpy的使用演示

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = { 0 };char arr2[] = "hello";char*p=strcpy(arr1, arr2);printf("%s\n", p);printf("%s\n", arr1);//两种打印方式都可以return 0;
}

 使用注意事项:

  • 源字符串必须以 '\0' 结束。
  • 会将源字符串中的 '\0' 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串,[ ]里不能为空。
  • 目标空间必须可修改,比如用char*p="xxxxxxxxxxxx"就不行,无法修改

4.2--strcpy的模拟实现

#include<stdio.h>
#include<assert.h>char* mystrcpy(char* arr1, const char* arr2)
{assert(arr1&&arr2);char* p = arr1;while ((*arr1++ = *arr2++)){;}return p;
}
int main()
{char arr1[20] = "xxxxxxxxxxxxxx";char arr2[] = "abcdef";char* ret = mystrcpy(arr1, arr2);printf("%s", ret);return 0;
}
//1.参数顺序
//2.函数的功能,停⽌条件
//3.assert
//4.const修饰指针
//5.函数返回值
//6.题⽬出⾃《⾼质量C/C++编程》书籍最后的试题部分

五.strcat的使用和模拟实现

1.  char *  strcat (char  *  destination, const char  *  source );

功能:字符串追加,把source指针的源字符串中的所有字符都追加到destination指向的空间中。

参数:destination指针,指向目的地空间;source指针,指向源头数据。

返回值:strcat函数返回的目标空间的起始地址。

5.1--strcat的使用演示 

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello";char arr2[] = "world";char* p = strcat(arr1, arr2);printf("%s\n", p);printf("%s\n", arr1);//两种打印方式都可以return 0;
}

使用注意事项:

  • 源字符串必须以 '\0' 结束。
  • 目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。
  • 目标空间必须有足够的大,能容纳下源字符串的内容,[ ]里不能为空。
  • 目标空间必须可修改,比如用char*p="hello"就不行,无法修改

5.2--strcat的模拟实现 

#include<stdio.h>
#include<assert.h>char* mystrcat(char* arr1, const char* arr2)
{assert(arr1 && arr2);char* p = arr1;while (*arr1){arr1++;}//找到目标字符串中的\0,明确从那里开始追加。while ((*arr1++ = *arr2++)){;}return p;
}
int main()
{char arr1[20] = "hello";char arr2[] = "world";char* ret = mystrcat(arr1, arr2);printf("%s", ret);return 0;
}

往期回顾节选:

【C语言指针超详解(六)】--sizeof和strlen的对比,数组和指针笔试题解析,指针运算笔试题解析

【趣味小游戏】--扫雷游戏

结语:本篇文章就到此结束了,继前面几篇文章后,在此篇文章中给大家分享了字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现等知识点,后续会继续分享字符函数和字符串函数的相关知识点,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。

相关文章:

【C语言字符函数和字符串函数(一)】--字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现

目录 一.字符分类函数 1.1--字符分类函数的理解 1.2--字符分类函数的使用 二.字符转换函数 2.1--字符转换函数的理解 2.2--字符转换函数的使用 三.strlen的使用和模拟实现 3.1--strlen的使用演示 3.2--strlen的返回值 3.3--strlen的模拟实现 四.strcpy的使用和模拟实现…...

deepseek问答记录:请讲解一下hugingface transformers中的AutoProcessor

Hugging Face Transformers库中的AutoProcessor是一个用于自动加载与预训练模型配套的处理器的工具类。它简化了预处理流程&#xff0c;特别适用于多模态模型&#xff08;如同时处理文本、图像、音频的模型&#xff09;。以下是详细讲解&#xff1a; 1. AutoProcessor的功能 •…...

大模型基础之量化

概述 量化&#xff0c;Quantization&#xff0c;机器学习和深度学习领域是一种用于降低计算复杂度、减少内存占用、加速推理的优化方法。定义&#xff1a;将模型中的数据从高精度表示转换为低精度表示。主要目的是为了减少模型的存储需求和计算复杂度&#xff0c;同时尽量减少…...

游戏引擎学习第286天:开始解耦实体行为

回顾并为今天的内容定下基调 我们目前正在进入实体系统的一个新阶段&#xff0c;之前我们已经让实体的移动系统变得更加灵活&#xff0c;现在我们想把这个思路继续延伸到实体系统的更深层次。今天的重点&#xff0c;是重新审视我们处理实体类型&#xff08;entity type&#x…...

win10-django项目与mysql的基本增删改查

以下都是在win10系统下&#xff0c;django项目的orm框架对本地mysql的表的操作 models.py----->即表对应的类所在的位置 在表里新增数据 1.引入表对应的在models.py中的类class 2.在views.py中使用函数&#xff1a;类名.objects.create(字段名值,字段名"值"。。。…...

Windows 本地部署MinerU详细教程

&#x1f4d6; 项目概述 MinerU是一款由OpenDataLab开发的开源PDF转Markdown工具&#xff0c;可以高质量地提取PDF文档内容&#xff0c;生成结构化的Markdown格式文本。本指南将帮助您在本地部署并使用MinerU。 ⭐ 功能特性 MinerU具有以下核心功能&#xff1a; ✨ 文档处理…...

动态范围调整(SEF算法实现)

一、背景介绍 继续在整理对比度调整相关算法&#xff0c;发现一篇单帧动态范围提升的算法&#xff1a;Simulated Exposure Fusion&#xff0c;论文表现看起来很秀&#xff0c;这里尝试对它进行了下效果复现。 二、实现流程 1、基本原理 整体来说&#xff0c;大致可以分为两步…...

SpringCloud微服务开发与实战

本节内容带你认识什么是微服务的特点&#xff0c;微服务的拆分&#xff0c;会使用Nacos实现服务治理&#xff0c;会使用OpenFeign实现远程调用&#xff08;通过黑马商城来带你了解实际开发中微服务项目&#xff09; 前言&#xff1a;从谷歌搜索指数来看&#xff0c;国内从自201…...

WAS和Tomcat的对比

一、WAS和Tomcat的对比 WebSphere Application Server (WAS) 和 Apache Tomcat 是两款常用的 Java 应用服务器&#xff0c;但它们有许多显著的区别。在企业级应用中&#xff0c;它们扮演不同的角色&#xff0c;各自有其特点和适用场景。以下是它们在多个维度上的详细对比&…...

Rust 数据结构:String

Rust 数据结构&#xff1a;String Rust 数据结构&#xff1a;String什么是字符串&#xff1f;创建新字符串更新字符串将 push_str 和 push 附加到 String 对象后使用 运算符和 format! 宏 索引到字符串字符串在内存中的表示字节、标量值和字形簇 分割字符串遍历字符串的方法 R…...

IntelliJ IDEA打开项目后,目录和文件都不显示,只显示pom.xml,怎样可以再显示出来?

检查.idea文件夹 如果项目目录中缺少.idea文件夹&#xff0c;可能导致项目结构无法正确加载。可以尝试删除项目根目录下的.idea文件夹&#xff0c;然后重新打开项目&#xff0c;IDEA会自动生成新的.idea文件夹和相关配置文件&#xff0c;从而恢复项目结构。 问题解决&#xff0…...

Hot100-链表-JS

160.相交链表 160. 相交链表 已解答 简单 相关标签 相关企业 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整…...

事件驱动架构:从传统服务到实时响应的IT新风潮

文章目录 事件驱动架构的本质&#xff1a;从请求到事件的范式转变在EDA中&#xff1a; 事件驱动架构的演进&#xff1a;从消息队列到云原生标配核心技术&#xff1a;事件驱动架构的基石与工具链1. 消息队列&#xff1a;事件传递的枢纽2. 消费者&#xff1a;异步处理3. 事件总线…...

网络流量分析 | NetworkMiner

介绍 NetworkMiner 是一款适用于Windows&#xff08;也适用于Linux/Mac&#xff09;的开源网络取证分析工具。它可被用作被动网络嗅探器/数据包捕获工具&#xff0c;也可被用于检测操作系统、会话、主机名、开放端口等&#xff0c;还能被用于解析pcap文件进行离线分析。点击此…...

弦理论的额外维度指的是什么,宇宙中有何依据

弦理论中的额外维度是解释微观世界与宏观宇宙矛盾的关键假设之一。它们并非科幻中的平行宇宙&#xff0c;而是通过严谨的数学框架提出&#xff0c;并可能留下可观测的宇宙学痕迹。以下是具体解析&#xff1a; 一、弦理论为何需要额外维度&#xff1f; 数学自洽性要求 弦理论中…...

std::tuple 用法

std::tuple 是 C11 引入的模板类&#xff0c;用来存储多个不同类型的值&#xff0c;类似于 Python 的元组。你可以把它看作是一种“组合多个变量在一个对象中”的方式。 ✅ 基本用法 #include <tuple> #include <iostream>int main() {std::tuple<int, std::st…...

深入理解 Git 分支操作的底层原理

在软件开发的世界里&#xff0c;Git 已经成为了版本控制的标配工具。而 Git 分支功能&#xff0c;更是极大地提升了团队协作和项目开发的效率。我们在日常开发中频繁地创建、切换和合并分支&#xff0c;但是这些操作背后的底层原理是怎样的呢&#xff1f;在之前的博客探秘Git底…...

Excel MCP: 自动读取、提炼、分析Excel数据并生成可视化图表和分析报告

最近&#xff0c;一款Excel MCP Server的开源工具火了&#xff0c;看起来功能很强大&#xff0c;咱们今天来一探究竟。 基础环境 最近两年&#xff0c;大家都可以看到AI的发展有多快&#xff0c;我国超10亿参数的大模型&#xff0c;在短短一年之内&#xff0c;已经超过了100个&…...

C语言:深入理解指针(4)

目录 一、字符指针变量 二、数组指针变量 三、二维数组传参的本质 四、函数指针变量 五、typedef 类型重命名 六、函数指针数组 一、字符指针变量 我们常见的字符指针变量是这样的&#xff1a; char a w; char* p &a; char arr[] "abcd"; char* pa ar…...

Gensim 是一个专为 Python 设计的开源库

Gensim 是一个专为 Python 设计的开源库&#xff0c;其核心代码和生态系统均基于 Python 构建&#xff0c;目前官方仅支持 Python 语言。如果你需要在其他编程语言中实现类似功能&#xff08;如词向量训练、主题模型等&#xff09;&#xff0c;通常需要使用对应语言的替代库或通…...

质量管理工程师面试总结

今天闲着无聊参加了学校招聘会的一家双选会企业&#xff0c;以下是面试的过程。 此次面试采用的是一对多的形式。&#xff08;此次三个求职者&#xff0c;一个面试官&#xff09; 面试官&#xff1a;开始你们每个人先做个自我介绍吧。 哈哈哈哈哈哈哈哈&#xff0c;其实我们…...

python 爬虫框架介绍

文章目录 前言一、Requests BeautifulSoup&#xff08;基础组合&#xff09;二、Scrapy&#xff08;高级框架&#xff09;三、PySpider&#xff08;可视化爬虫&#xff09;四、Selenium&#xff08;浏览器自动化&#xff09;五、Playwright&#xff08;新一代浏览器自动化&…...

window 显示驱动开发-使用有保证的协定 DMA 缓冲区模型

Windows Vista 的显示驱动程序模型保证呈现设备的 DMA 缓冲区和修补程序位置列表的大小。 修补程序位置列表包含 DMA 缓冲区中命令引用的资源的物理内存地址。 在有保证的协定模式下&#xff0c;用户模式显示驱动程序知道 DMA 缓冲区和修补程序位置列表的确切大小&#xff0c;…...

蓝牙协议架构与调试工具详解(含 BLE、HCI 命令、调试命令)

本文介绍蓝牙协议从物理层到应用层的完整通信流程&#xff0c;并详解了 Linux 下主流蓝牙调试工具的使用方法&#xff0c;适用于嵌入式蓝牙驱动开发、BLE调试、通信协议分析等场景。 &#x1f527; 1. 蓝牙架构概览 ✅ 芯片架构 单模芯片&#xff1a;仅支持 BLE 或 Classic 蓝…...

预测模型开发与评估:基于机器学习的数据分析实践

在当今数据驱动的时代&#xff0c;预测模型已成为各行各业决策制定的核心工具。本文将分享我在COMP5310课程项目中开发预测模型的经验&#xff0c;探讨从数据清洗到模型优化的完整过程&#xff0c;并提供详细的技术实现代码。 ## 研究问题与数据集 ### 研究问题 我们的研究聚焦…...

提高表达能力

你遇到的这种情况其实很常见&#xff0c;背后的原因可能涉及思维模式、心理状态和表达习惯的综合作用。以下是具体分析和解决方案&#xff1a; 1. 原因分析&#xff1a;为什么讨论时流畅&#xff0c;独自表达却卡壳&#xff1f; 外部反馈缺失&#xff1a;讨论时对方的提问、反…...

【更新】全国省市县-公开手机基站数据集(2006-2025.3)

手机基站是现代通信网络中的重要组成部分&#xff0c;它们为广泛的通信服务提供基础设施。随着数字化进程的不断推进&#xff0c;手机基站的建设与布局对优化网络质量和提升通信服务水平起着至关重要的作用&#xff0c;本分享数据可帮助分析移动通信网络的发展和优化。本次数据…...

基于MNIST数据集的手写数字识别(CNN)

目录 一&#xff0c;模型训练 1.1 数据集介绍 1.2 CNN模型层结构 1.3 定义CNN模型 1.4 神经网络的前向传播过程 1.5 数据预处理 1.6 加载数据 1.7 初始化 1.8 模型训练过程 1.9 保存模型 二&#xff0c;模型测试 2.1 定义与训练时相同的CNN模型架构 2.2 图像的预处…...

MYSQL创建索引的原则

创建索引的原则包括&#xff1a; 表中的数据量超过10万以上时考虑创建索引。 选择查询频繁的字段作为索引&#xff0c;如查询条件、排序字段或分组字段。 尽量使用复合索引&#xff0c;覆盖SQL的返回值。 如果字段区分度不高&#xff0c;可以将其放在组合索引的后面。 对于…...

运行Spark程序-在shell中运行

Spark Shell运行程序步骤 启动Spark Shell 根据语言选择启动命令&#xff1a; Scala版本&#xff08;默认&#xff09;&#xff1a;执行spark-shellPython版本&#xff1a;执行pyspark 数据加载示例 读取本地文本文件&#xff1a; // Scala版本 val textData sc.textFile(…...