C语言第二十五弹---字符函数和字符串函数(上)

news2024/11/27 21:38:37

 

个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】

目录

1、字符分类函数

2、字符转换函数

3、strlen的使用和模拟实现

4、strcpy 的模拟实现

5、strcat 的模拟实现

6、strcmp 的模拟实现

7、strncpy 函数的使用

总结


在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。

1、字符分类函数

C语言中有⼀系列的函数是专门做字符分类的,也就是⼀个字符是属于什么类型的字符的。
这些函数的使用都需要包含⼀个头文件是 ctype.h
int islower ( int c );
islower 是能够判断参数部分的 c 是否是小写字母的。
通过返回值来说明是否是小写字母, 如果是小写字母就返回非0的整数,如果不是小写字母,则返回0。
上述函数比较简单,uu们自行验证啦,最好通过查库函数的相关知识验证喔~
练习:
写⼀个代码,将字符串中的小写字母转大写,其他字符不变。
#include <stdio.h>
#include <ctype.h>//判断字符函数的头文件
int main ()
{
 int i = 0;
 char str[] = "Test String.\n";
 char c;
 while (str[i])
 {
 c = str[i];
 if (islower(c)) //如果是小写字母则执行
 c -= 32;//大小写之间ASCII码值间隔32,也可以通过两个字符相减,即'a'-'A';
 
 putchar(c);//输出该字符
 i++;
 }
 return 0;
}

2、字符转换函数

C语言提供了2个字符转换函数:
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写 
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
上面的代码,我们将小写转大写,是 -32 完成的效果,有了转换函数,就可以直接使用  tolower
数。
#include <stdio.h>
#include <ctype.h>
int main ()
{
 int i = 0;
 char str[] = "Test String.\n";
 char c;
 while (str[i])
 {
 c = str[i];//将该字符放在临时变量中
 if (islower(c)) //是小写字母则转换
 c = toupper(c);
 putchar(c);//输出字符
 i++;
 }
 return 0;
}

3、strlen的使用和模拟实现

注:在模拟实现函数时,尽可能的将以下五个点都考虑到。

1.参数顺序

2.const修饰指针(防止指针被修改)
3.函数的功能,停止条件

4.assert(对空指针进行判断)
5.函数返回值

size_t strlen ( const char * str );
字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
参数指向的字符串必须要以 '\0' 结束。
注意函数的返回值为size_t,是无符号的( 易错 )
strlen的使用需要包含头文件
学会strlen函数的模拟实现
#include <stdio.h>
#include <string.h>//strlen函数需包含的头文件
int main()
{
 const char* str1 = "abcdef";
 const char* str2 = "bbb";
 if(strlen(str2)-strlen(str1)>0)
 {
 printf("str2>str1\n");
 } 
 else
 {
 printf("srt1>str2\n");
 }
 return 0;
}
strlen的模拟实现:
方式1:
strlen计算的是传入的指针到'\0'之间个数,我们第一想到的肯定是通过遍历该数组,计算字符串长度,然后根据上面注意的五个点,一步一步进行实现。
首先参数顺序,只有一个参数不需要管顺序。
第二个const修饰指针,此处只需遍历数组不会修改字符,因此可以用const修饰指针。
第三个函数功能是计算字符串长度,'\0'之前的长度。
第四个assert断言,传参是指针,所以有可能是空指针,此处可以进行断言,空指针则报错。
第五个返回值位无符号整数,C语言提供无符号整数类型size_t,此处用int影响也不会很大,只是用size_t更加标准准确。
//计数器方式
size_t my_strlen(const char * str)
{
 int count = 0;
 assert(str);//空指针则报错
 while(*str)//遍历字符串,遇到'\0'则结束循环
 {
 count++;
 str++;
 }
 return count;//返回大小
}
方式2:
递归实现,长度=1+strlen(str+1),字符串长度=该字符+后面字符串的长度。
//不能创建临时变量计数器
size_t my_strlen(const char * str)
{
 assert(str);//空指针则报错
 if(*str == '\0')
 return 0;
 else
 return 1+my_strlen(str+1);
}
方式3:
根据前面指针知识所学,指针-指针=相差元素个数,因此字符串长度可以通过指针-指针计算。
//指针-指针的⽅式
size_t my_strlen(const char *s)
{
 assert(str);
 char *p = s;
 while(*p != ‘\0’ )
 p++;
 return p-s;
}

4、strcpy 的模拟实现

 char* strcpy(char * destination, const char * source );
Copies the C string pointed by source into the array pointed by destination, including the
terminating null character (and stopping at that point).
将 source 指向的 C 字符串复制到目标指向的数组中,包括终止 null 字符(并在该点停止)。
源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷贝到目标空间。
目标空间 必须足够大,以确保能存放源字符串。
目标空间必须可修改。
学会模拟实现。
strcpy的模拟实现:
//1.参数顺序 第一个为目标字符串,第二个为原来字符串
//2.const修饰指针 目标需要修改,原来不需要修改
//3.函数的功能,停⽌条件
//4.assert 两个均不能为空指针
//5.函数返回值 返回目标字符串首地址
//6.题⽬出⾃《⾼质量C/C++编程》书籍最后的试题部分
char *my_strcpy(char *dest, const char*src)
{ 
 char *ret = dest;
 assert(dest != NULL);//为真则不报错
 assert(src != NULL);//为真则不报错
 
 
 while((*dest++ = *src++))
 {
 ;
 }
 return ret;
}

5、strcat 的模拟实现

Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.
将源字符串的副本追加到目标字符串。destination 中的终止 null 字符被 source 的第一个字符覆盖,并且在 destination 中由两者串联形成的新字符串的末尾包含一个 null 字符。
源字符串必须以 '\0' 结束。
目标字符 串中也得有 ' \0'  ,否则没办法知道追加从哪里开始。
目标 空间必须有足够的大,能容纳下源字符串的内容。
目标 空间必须可修改。
字符串自己给自己追加,如何?
模拟实现strcat函数:
char *my_strcat(char *dest, const char*src)
{
 char *ret = dest;
 assert(dest != NULL);
 assert(src != NULL);
 while(*dest)
 {
 dest++;
 }
 while((*dest++ = *src++))
 {
 ;
 }
 return ret;
}

6、strcmp 的模拟实现

This function starts comparing the first character of each string. If they are equal to each
other, it continues with the following pairs until the characters differ or until a terminating
null-character is reached.
此函数开始比较每个字符串的第一个字符。如果它们相等,则继续往下比较,直到字符不同或终止达到 null-character。
标准规定:
第⼀个字符串大于第⼆个字符串,则返回大于0的数字
第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串小于第⼆个字符串,则返回小于0的数字
那么如何判断两个字符串? 比较两个字符串中对应位置上字符ASCII码值的大小。
strcmp函数的模拟实现:
int my_strcmp (const char * str1, const char * str2)
{
 int ret = 0 ;
 assert(src != NULL);
 assert(dest != NULL);
 while(*str1 == *str2)
 {
 if(*str1 == '\0')//两个字符串相等且遇到'\0'即字符串相等,返回0
 return 0;
 str1++;
 str2++;
 }
 return *str1-*str2;//不相等返回差值,>0即str1大,<0即str2大
}

7、strncpy 函数的使用

 
char * strncpy ( char * destination, const char * source, size_t num );
Copies the first num characters of source to destination. If the end of the source C string
(which is signaled by a null-character) is found before num characters have been copied,
destination is padded with zeros until a total of num characters have been written to it.
将源的前 num 个字符复制到目标。如果源 C 字符串的末尾(由 null 字符表示)在复制 num 个字符之前找到,destination 用零填充,直到总共写入了 num 个字符。
拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
#include <stdio.h>
#include <string.h>//strncpy函数需包含的头文件
int main()
{
  char str1[]="abcdeef";
  char str2[20]={0};
  strncpy(str2,str1,5);
  printf("%s\n",str2);
  return 0;
}

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

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

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

相关文章

【Pygame手册02/20】pygame模块display控制窗口和屏幕

目录 一、说明二、pygame.display接口函数2.1 函数表格2.2 pygame.display的功能 三、详细的函数调用3.1 pygame.display.init()3.2 pygame.display.quit()3.3 pygame.display.get_init()3.4 pygame.display.set_mode()3.5 pygame.display.get_surface()3.6 pygame.display.fl…

qml之Control类型布局讲解,padding属性和Inset属性细讲

1、Control布局图 2、如何理解&#xff1f; *padding和*Inset参数如何理解呢&#xff1f; //main.qml import QtQuick 2.0 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtQuick.Controls 1.4 import QtQml 2.12ApplicationWindow {id: windowvisible: …

ChatGPT绘图指南:DALL.E3玩法大全(二)

在前一篇文章中&#xff0c;我们介绍了什么是 DALL.E3 模型&#xff0c; DALL.E3 有什么优势&#xff0c;使用DALL.E3 的两种方法&#xff0c;以及DALL.E3 绘图的基本规则&#xff0c; 感兴趣的朋友请前往查看: ChatGPT绘图指南&#xff1a;DALL.E3玩法大全(一). 接下来&#…

插值(一)——多项式插值(C++)

插值 插值的作用是可以将原本比较难计算的函数转换为误差在一定范围内的多项式&#xff0c;比如在单片机中直接计算 x 、 log ⁡ 2 x \sqrt{x}、\log_2x x ​、log2​x之类的函数是比较麻烦的&#xff0c;但是使用插值的方法就可以将其转换为误差可控的只有乘法和加减法的多项…

EF Core 模型优先——根据类对象创建数据表

需要的nuget包&#xff1a; Microsoft.EntityframeworkCore.SqlServer &#xff08;根据自己的数据库类型选择对应的nuget包&#xff09; Microsoft.EntityframeworkCore.Tools Microsoft.VisualStudio.Web.CodeGeneration.Design 说明&#xff1a; &#xff08;1&#xf…

【C++】C++11上

C11上 1.C11简介2.统一的列表初始化2.1 {} 初始化2.2 initializer_list 3.变量类型推导3.1auto3.2decltype3.3nullptr 4.范围for循环5.final与override6.智能指针7. STL中一些变化8.右值引用和移动语义8.1左值引用和右值引用8.2左值引用与右值引用比较8.3右值引用使用场景和意义…

机器学习中的10种非线性降维技术对比总结

降维意味着我们在不丢失太多信息的情况下减少数据集中的特征数量&#xff0c;降维算法属于无监督学习的范畴&#xff0c;用未标记的数据训练算法。 尽管降维方法种类繁多&#xff0c;但它们都可以归为两大类:线性和非线性。 线性方法将数据从高维空间线性投影到低维空间(因此…

排序算法---计数排序

原创不易&#xff0c;转载请注明出处。欢迎点赞收藏~ 计数排序&#xff08;Counting Sort&#xff09;是一种线性时间复杂度的排序算法&#xff0c;其核心思想是通过统计待排序元素的个数来确定元素的相对位置&#xff0c;从而实现排序。 具体的计数排序算法步骤如下&#xff…

【Go语言】Go项目工程管理

GO 项目工程管理&#xff08;Go Modules&#xff09; Go 1.11 版本开始&#xff0c;官方提供了 Go Modules 进行项目管理&#xff0c;Go 1.13开始&#xff0c;Go项目默认使用 Go Modules 进行项目管理。 使用 Go Modules的好处是不再需要依赖 GOPATH&#xff0c;可以在任意位…

[leetcode刷题] 组合

对于递归回溯我觉得是需要多写多分析&#xff0c;递归三部曲&#xff1a;1.返回值和参数&#xff1b;2.终止条件&#xff1b;3.单层递归逻辑 1.通常情况下返回值都是void&#xff0c;参数的话根据实际需求设计&#xff0c;如果设置了全局变量那输入参数就可以少写几个&#xf…

Elasticsearch:特定领域的生成式 AI - 预训练、微调和 RAG

作者&#xff1a;来自 Elastic Steve Dodson 有多种策略可以将特定领域的知识添加到大型语言模型 (LLM) 中&#xff0c;并且作为积极研究领域的一部分&#xff0c;正在研究更多方法。 对特定领域数据集进行预训练和微调等方法使 LLMs 能够推理并生成特定领域语言。 然而&#…

009集——磁盘详解——电脑数据如何存储在磁盘

很多人也知道数据能够保存是由于设备中有一个叫做「硬盘」的组件存在&#xff0c;但也有很多人不知道硬盘是怎样储存这些数据的。这里给大家讲讲其中的原理。 首先我们要明白的是&#xff0c;计算机中只有0和1&#xff0c;那么我们存入硬盘的数据&#xff0c;实际上也就是一堆0…

猫头虎分享已解决Bug ‍ || Go Error: no Go files in /path/to/directory

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

JVM(5)面试篇

1 什么是JVM&#xff1f; 关联课程内容 基础篇-初识JVM基础篇-Java虚拟机的组成 回答路径 JVM的定义作用功能组成 1、定义&#xff1a; JVM 指的是Java虚拟机&#xff08; Java Virtual Machine &#xff09;。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是…

猫头虎分享已解决Bug ‍ || Python Error: IndentationError: expected an indented block

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Ollama 可以在 Windows 上运行了

Ollama 可以在 Windows 上运行了 0. 引言1. 下载 Ollma 安装文件2. 安装 Ollama3. 使用 Ollama 0. 引言 Ollama 终于可以在 Windows 上运行了&#xff0c;一直以来都是 “Coming soon”。 运行 Mixtral 8*7B 试了一下&#xff0c;推理速度和推理效果都很不错。 而且模型的下…

【mysql】数据约束

一、数据约束&#xff1a; 什么是约束&#xff1f; 为了确保表中的数据的完整性(准确性、正确性)&#xff0c;为表添加一些限制。是数据库中表设计的一个最基本规则。使用约束可以使数据更加准确&#xff0c;从而减少冗余数据&#xff08;脏数据&#xff09;。 数据库完整性约…

PowerShell搭建vue起始项目

Windows PowerShell搭建vue起始项目 搜索PowerShell,以管理员身份运行。 复制文件夹路径 cd 到这个文件夹位置 命令行创建项目&#xff1a;vue create 项目名 这里写自己的项目名就行&#xff0c;我写的yeb vue create yeb 创建成功后是这样的 有颜色的就是选中的&#xff…

【区块链技术开发语言】在ubuntu18 系统环境下命令操作安装GO语言开发环境

要在Ubuntu 18系统上安装GO语言开发环境,您可以按照以下步骤进行: 打开终端(Ctrl + Alt + T)。 使用以下命令下载GO语言安装包: 或者手动打开链接下载: wget https://golang.org/dl/go1.17.5.linux-amd64.tar.gz确保替换链接中的版本号为最新版本。 解压下载的安装包…

Stable Diffusion系列(五):原理剖析——从文字到图片的神奇魔法(扩散篇)

文章目录 DDPM论文整体原理前向扩散过程反向扩散过程模型训练过程模型生成过程概率分布视角参数模型设置论文结果分析 要想完成SD中从文字到图片的操作&#xff0c;必须要做到两步&#xff0c;第一步是理解文字输入包含的语义&#xff0c;第二步是利用语义引导图片的生成。下面…