C语言字符函数与字符串函数:编织文字的舞会之梦(上)

欢迎来到白刘的领域   Miracle_86.-CSDN博客

系列专栏  C语言知识

先赞后看,已成习惯

   创作不易,多多支持!

 在编程的过程中,我们经常要处理字符以及字符串,为了方便操作这些字符和字符串,C语言标准库中提供了一系列库函数,接下来我们就一起来学习这些函数,帮助字符和字符串完成它们的舞会之梦。

目录

一、字符分类函数

二、字符转换函数

三、strlen函数的使用以及模拟实现

方法1

方法2

方法3

四、strcpy函数的使用以及模拟实现

五、strcat函数的使用以及模拟实现

六、strcmp函数的使用以及模拟实现


一、字符分类函数

在C语言中,有一系列函数是专门用来做字符分类的,也就是一个字符是属于什么类型的字符。这些函数都包含在一个头文件:<ctype.h>。

其实上述的函数的使用方法都是非常类似的,所以我们就仅拿其中一个来举例说明。

int islower(int c);

islower函数可以判断一个字符是不是小写字母。

通过返回值来说明是否为小写字母,如果是则返回非0的整数,如果不是则返回0。

我们来举例练习一下:

//写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。
#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;putchar(c);i++;}return 0;
}

因为'A'的ASCII码值是65,'a'的ASCII码值为97,97-65=32,故转换仅需减32即可。

来看运行结果:

二、字符转换函数

C语言中提供了两个字符转换函数:

int tolower(int c); //将参数传进去的⼤写字⺟转⼩写 
int toupper(int c); //将参数传进去的⼩写字⺟转⼤写

刚刚的代码我们是将字符-32来完成效果,这回我们有了字符转换函数,就可以之间上函数了。

#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;
}

 运行结果是一样的:

三、strlen函数的使用以及模拟实现

我们先来看看strlen函数的原型:

size_t strlen(const char* str);

str我们很熟悉了,是string(字符串)的缩写,len其实是length的意思,所以这个函数大概我就能知道字面意思,它是用来求字符串长度的。

我们知道字符串是以'\0'结尾的,而strlen函数返回的就是在字符串在'\0'之前出现的字符的个数(不包含'\0')。

这里要注意几个点:

1.参数指向的字符串必须是以'\0'结尾。

2.参数的返回值是size_t类型的,是无符号的(易错)。

3.strlen函数是需要头文件的,它的头文件是<string.h>。

那了解完strlen的基本知识,接下来我们来看看它的实战使用:

#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("srt1>str2\n");}return 0;
}

接下来看模拟实现:

方法1

//计数器⽅式
int my_strlen(const char* str)
{int count = 0;assert(str);while (*str){count++;str++;}return count;
}

法1创建了个临时变量来计数,还使用了指针运算,由于'\0'为假,指针指到它时,也就意味着字符串结束,循环也就结束。我们还用到了assert断言,严谨一些,养成良好的习惯。

方法2

//不能创建临时变量计数器
int my_strlen(const char* str)
{assert(str);if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}

法2中我们使用了递归,由于每次我们都是+1,所以很容易想到使用递归来完成代码的实现。这里不会递归的兄弟们,传送门放在下面了:

C语言中的套娃——函数递归_俄罗斯套娃可以用递归实现吗-CSDN博客

方法3

//指针-指针的⽅式
int my_strlen(char* s)
{assert(s);char* p = s;while (*p != '\0')p++;return p - s;
}

 这种方法也使用了指针运算,可见指针运算有多好用:

灵魂指针,教给(一)-CSDN博客

这篇文章详细地讲述了指针的运算。

首先由于传进来的是字符串的首元素地址,然后我们再创建一个指针来移动,最后指针指向字符串末尾,首尾相减,便能知晓中间长度,也就是字符串的长度。

四、strcpy函数的使用以及模拟实现

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

首先我们认识两个单词:destination n.目的地,source n.源头。

然后我们再来拆分一下strcpy的字面意思,str还是字符串,cpy其实是copy的意思,那我们可以知道了,strcpy是用来拷贝字符串的。

这里说明几点细节:

1.原理:将 source 指向的 C 字符串复制到destination指向的数组中,包括终止 null 字符(并在该点停止)

2.源字符串必须以'\0'结尾。

3.目标空间必须足够大,确保能放下源字符串。

4.目标空间必须是可修改的。

接下来我们来看它的使用:

#include <stdio.h>
#include <string.h>
int main()
{char src[40];char dest[40];strcpy(src, "Hello World");strcpy(dest, src);printf("最终的目标字符串:%s\n", dest);return 0;
}

 来看运行结果:

接下来我们来学习strcpy的模拟实现:

我们可以用两个指针分别指向目的地和源头,然后通过赋值即可完成拷贝。

//1.参数顺序
//2.函数的功能,停⽌条件
//3.assert
//4.const修饰指针
//5.函数返回值
//6.题⽬出⾃《⾼质量C/C++编程》书籍最后的试题部分
#include <stdio.h>
char* my_strcpy(char* dest, const char* src)
{char* ret = dest;assert(dest != NULL);assert(src != NULL);while (*src != '\0'){*dest = *src;dest++;src++;}*dest = *src; //拷贝'\0'return ret;}

 上述代码已经可以完成效果了,但是我们还可以有更巧妙的代码:

#include<stdio.h>
char* my_strcpy(char* dest, const char* src)
{char* ret = dest;assert(dest != NULL);assert(src != NULL);while ((*dest++ = *src++)){;}return ret;}

虽然++的优先级比*高,但是是后置++,先操作后++,所以先解引用,完成赋值后再++,最后到'\0',退出循环,是不是很巧妙。

五、strcat函数的使用以及模拟实现

char *strcat(char *dest, const char *src)

老规矩还是字面分析,str字符串,这个cat可不是小猫的那个cat,而是catenate的缩写,意思是连成一串。

1.原理:将源字符串的副本追加到目标字符串。终止 null 字符在 destination 中被 source 的第一个字符覆盖,并包含一个 null 字符在由两者在目的地的串联形成的新字符串的末尾。

2.源字符串必须以'\0'结尾。

3.目标字符串也需要有'\0',否则不知道从哪开始追加。

4.目标空间足够大。

5.目标空间可修改。

#include <stdio.h>
#include <string.h>
int main()
{char src[50];char dest[50];strcpy(src, "World");strcpy(dest, "Hello ");strcat(dest, src);printf("最终的目标字符串:%s", dest);return 0;
}

 运行结果:

之后我们学习strcat的模拟,这个其实很简单,刚刚我们学到了strcpy的模拟,那这个无非就是先找到destination中的'\0'再copy,代码如下:

#include<stdio.h>
#include<assert.h>
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;
}

六、strcmp函数的使用以及模拟实现

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

cmp是compare的缩写,是比较,顾名思义strcmp是比较字符串的。

1.原理:此函数开始比较每个字符串的第一个字符。如果它们等于彼此,它继续往下比较,直到字符不同或终止达到 null-character。

2.返回值:

  • 如果返回值小于 0,则表示 str1 小于 str2。
  • 如果返回值大于 0,则表示 str1 大于 str2。
  • 如果返回值等于 0,则表示 str1 等于 str2。 

3.比较的是两个字符的ASCII码值的大小。

#include <stdio.h>
#include <string.h>int main ()
{char str1[15];char str2[15];int ret;strcpy(str1, "abcdef");strcpy(str2, "ABCDEF");ret = strcmp(str1, str2);if(ret < 0){printf("str1 小于 str2");}else if(ret > 0) {printf("str1 大于 str2");}else {printf("str1 等于 str2");}return(0);
}

 strcmp的模拟实现,这个其实很简单,直接上代码:

int my_strcmp(const char* str1, const char* str2)
{int ret = 0;assert(str1 != NULL);assert(str2 != NULL);while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}return *str1 - *str2;
}

未完待续...... 

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

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

相关文章

nodejs社区垃圾分类管理平台的设计与实现python-flask-django-php

近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;社区垃圾分类管理平台利用计算机网络实现信息化管理&#xff0c;使整个社区垃圾分类管理的发展和服务水平有显著提升。 语言&#xf…

EasyExcel模板填充list时按第一行格式合并单元格(含分页线设置)

前言&#xff1a; 在使用easyExcel填充list时&#xff0c;第一行存在合并单元格的情况下&#xff0c;后面使用forceNewRow()填充的行却没有合并样式。 模板&#xff1a; 填充后&#xff1a; 自定义拦截器&#xff1a; 根据官方文档的提示&#xff0c;我们需要自定义拦截器来…

RK3399 android10 移植SiS-USB触摸驱动

一&#xff0c;SiS USB触摸简介 SiS USB 触摸屏通常是一种外接式触摸屏设备&#xff0c;通过 USB 接口连接到计算机或其他设备上。这种触摸屏设备可以提供触摸输入功能&#xff0c;用户可以通过手指或触控笔在屏幕上进行操作&#xff0c;实现点击、拖动、缩放等操作。 SiS USB…

(三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练

这里写目录标题 一、colmap解算数据放入高斯1. 将稀疏重建的文件放入高斯2. 将稠密重建的文件放入高斯 二、vkitti数据放入高斯 一、colmap解算数据放入高斯 运行Colmap.bat文件之后&#xff0c;进行稀疏重建和稠密重建之后可以得到如下文件结构。 1. 将稀疏重建的文件放入高…

线段树优化dp

abc339 E - Smooth Subsequence 思路&#xff1a;我们很容想到一个 n n n方的的状态转移方程&#xff0c;即对于每个i&#xff0c;我们去枚举 1 1 1到 i − 1 i-1 i−1的状态&#xff0c;即 d p [ i ] m a x ( d p [ i ] , d p [ j ] 1 ) ; dp[i]max(dp[i],dp[j]1); dp[i]ma…

异常:程序出现的问题

目的&#xff1a;为了以后发现异常后怎么去处理 异常的作用

(css)步骤条el-steps区分等待、进行中、完成三种状态的图片

(css)步骤条el-steps区分等待、进行中、完成三种状态的图片 效果&#xff1a; <el-steps :active"active" finish-status"success" class"steps"><el-step title"选择.."></el-step><el-step title"..规则&…

Photoshop 2024让图像处理更智能、更高效@

Photoshop 2024是一款功能强大的图像处理软件&#xff0c;广泛应用于创意设计和图像处理领域。它提供了丰富的绘画和编辑工具&#xff0c;包括画笔、铅笔、颜色替换、混合器画笔等&#xff0c;使用户能够轻松进行图片编辑、合成、校色、抠图等操作&#xff0c;实现各种视觉效果…

「数据分析」之零基础入门数据挖掘

摘要&#xff1a;对于数据挖掘项目&#xff0c;本文将学习应该从哪些角度分析数据&#xff1f;如何对数据进行整体把握&#xff0c;如何处理异常值与缺失值&#xff0c;从哪些维度进行特征及预测值分析&#xff1f; 探索性数据分析&#xff08;Exploratory Data Analysis&#…

Mysql——基础命令集合

目录 前期准备 先登录数据库 一、管理数据库 1.数据表结构解析 2.常用数据类型 3.适用所有类型的修饰符 4.使用数值型的修饰符 二、SQL语句 1.SQL语言分类 三、Mysql——Create,Show,Describe,Drop 1.创建数据库 2.查看数据库 3.切换数据库 4.创建数据表 5.查看…

模型部署 - onnx的导出和分析 - onnx 的架构和 onnx helper 的使用 - 学习记录

onnx 的架构和 onnx helper 的使用 简介一、onnx 的架构二、onnx 实践2.1、 create - linear.onnx2.1.1、要点一&#xff1a;创建节点2.1.2、要点二&#xff1a;创建张量2.1.3、要点三&#xff1a;创建图 2.2、 create - onnx.convnet2.3、使用 onnx helper 导出的基本流程总结…

理解数据库习题

1.选择 &#xff08;1&#xff09;现实世界中客观存在并能相互区别的事物称为&#xff08; &#xff09;。 A.实体 B.实体集 C字段 D 记录 &#xff08;2&#xff09;下列实体类型的联系中&#xff0c;属于一对一联系的是&#xff08; &#xff09;A.教研室对教师的所属联系 …

[BT]BUUCTF刷题第2天(3.20)

第2天&#xff08;共5题&#xff09; Web [ACTF2020 新生赛]Exec Payload&#xff1a;target127.0.0.1;cat /flag 分号;在许多shell中用作命令分隔符&#xff0c;意味着在执行完前一个命令&#xff08;这里是设置target变量&#xff09;后&#xff0c;接着执行cat /flag命令…

企业工商年报注册注销商标注册异常处理小程序开源版开发

企业工商年报注册注销商标注册异常处理小程序开源版开发 1、独立业务模型包括&#xff1a;企业工商年报、企业工商登记注册、企业注销登记、企业异常处理。 2、通用业务模型适合各种业务&#xff0c;比如&#xff1a;商标注册代理、财务会计服务、企业版权登记登。 当然&…

从深度伪造到恶意软件:网络安全迎来AI新挑战

如今&#xff0c;有越来越多的恶意行为者开始利用AI大语言模型开发能够绕过 YARA 规则的自我增强型恶意软件。 根据近日Recorded Future 发布的一份新报告&#xff1a;AI可以通过增强小型恶意软件变种的源代码来规避基于字符串的 YARA 规则&#xff0c;从而有效降低检测率。 …

这里是一本关于 DevOps 企业级 CI/CD 实战的书籍...

文章目录 &#x1f4cb; 前言&#x1f3af; 什么是 DevOps&#x1f3af; 什么是 CI/CD&#x1f3af;什么是 Jenkins&#x1f9e9; Jenkins 简单案例 &#x1f3af; DevOps 企业级实战书籍推荐&#x1f525; 参与方式 &#x1f4cb; 前言 企业级 CI/CD 实战是一个涉及到软件开发…

Linux CentOS 7.6安装Redis 6.2.6 详细保姆级教程

1、安装依赖 //检查是否有依赖 gcc -v //没有则安装 yum install -y gcc2、下载redis安装包 //进入home目录 cd /home //通过wget下载redis安装包 wget https://download.redis.io/releases/redis-6.2.6.tar.gz //解压安装包 tar -zxvf redis-6.2.6.tar.gz3、编译 //进入解压…

【Linux】如何使用git命令行与远程仓库建立连接(以Gitee为例)

目录 01.创建仓库 开源 初始化​编辑 设置模版 ​编辑 02.下载仓库到本地 03.提交贡献到远程仓库 01.创建仓库 首先在Gitee网站上登录你的账户&#xff0c;并创建一个新的仓库&#xff0c;输入仓库名称后就会自动生成仓库路径 开源 可以选择你的仓库是否开源。 开源仓…

企业如何选择一个开源「好」项目?

开源 三句半 oss-roast 需求明确是关键 风险考量要周全 开源虽好不白捡 别忘合规&#xff01; 显然&#xff0c;开源已成为一股不可阻挡的洪流&#xff0c;企业拥抱开源&#xff0c;积极参与开源项目不仅是响应技术潮流的必然选择&#xff0c;更是实现自身技术创新、市场拓展等…

AI开源概览及工具使用

一、前言 随着ChatGPT热度的攀升&#xff0c;越来越多的公司也相继推出了自己的AI大模型&#xff0c;如文心一言、通义千问等。各大应用也开始内置AI玩法&#xff0c;如抖音的AI特效&#xff1b; 关联资源&#xff1a;代码 GitHub、相关论文、项目Demo、产品文档、Grok Ai、gr…