C语言——字符函数和字符串函数

Hello,大家好,今天和大家分享C语言中的几个字符函数和字符串函数,记得三连支持一下哦!

f8a93516de62448e8a27e3d7bb16216b.jpeg

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

一、字符分类函数

在C语言中有一些函数是专门来分类字符的,也就是⼀个字符是属于什么类型的字符的。如:
35e31eba2d954a4dbfc90000a19dc3ca.png

这些函数都需要包含<ctype.h>头文件且它们的用法都是差不多的下面就拿isupper举例,isupper是检查字符是否为大写字符的函数,通过返回值来说明是否是大写字⺟,如果是大写字⺟就返回⾮0的整数,如果不是大写字⺟,则返回0。如:

3dd8ea4fcbdc4e51872ca887e214d4b6.png74b4b76a538a42b8a8021e51c48e2903.png

下面我们来练习一下:写⼀个代码,将字符串中的大写字⺟转小写,其他字符不变。

63640fdd38004c458b9adbec71e6553e.png

这里isupper只能判断是否为大写字母,我们还要自己将大写字母转换为小写,下面介绍两个能自动转换字符大小写的函数。

二、字符转换函数

63df482edd1f49c5950e26544a89296f.png

这两个函数能自动转换字符的大小写,如:

a13565e819ea4c3c90d529faa2b58d01.png

那么我们上面将字符串中的大写字⺟转小写,其他字符不变的代码就可以改进了:

16b5b75205ad4f049518b7f68162bdda.png

三、字符串函数

1.strlen的使⽤和模拟实现

strlen是一个计算字符串长度的函数,将一个字符串作为参数传给它,它会从字符串第一个字符开始计数直到碰到 '\0' 就返回前面的字符串长度。我们需要注意以下几点:

1.字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包含 '\0' );
2.参数指向的字符串必须要以 '\0' 结束;

3.注意函数的返回值为size_t,是⽆符号的;
4.strlen的使⽤需要包含头⽂件<string.h>。


1121de45b9ac4dd2b7822760e2715429.png

下面我们来看例子:5dc621f25a92413da3b80ba45761459e.png

注意:空格也算作一个字符。

935d830531634559a5ed34c30a6f3922.png

学习了strlen函数后,我们接下来就模拟实现一下。

strlen函数比较简单,模拟实现它的方法也有好几种,下面依次我们实现:

1.计数法

计数法很好理解,就是读取一个字符就计数一次碰到'\0'结束,返回记的数。我们来看代码:bccc6b2c867448fbbe2258e780688339.png

2.递归法

我们先来看代码:

317c6db369c54358b6af402cc40e64da.png

递归法也很好理解:从第一个字符开始往后递推,当碰到'\0'时开始回溯,就一直加1,最后得到结果。0d4b4386e72a4be38c25566f2ee3f41b.png

3.指针法

指针法应用了指针减指针,我们用字符串'\0'前一个字符的地址减去字符串首地址,得到的就是字符串长度。

491866351ebb40f3bb1df71c23dbafcf.png

以上就是strlen的使⽤和模拟实现。

2.strcpy的使⽤和模拟实现

strcpy是一个字符串拷贝函数,它能将一个字符串拷贝到另一个数组中。6201a8033684414484dd54d5399226a0.png

在使用时我们要注意:

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

5.strcpy的使⽤需要包含头⽂件<string.h>。

例如:

80b49e54d3664b90841919300d226145.png

f59a73a986184201ab69b6f965132eaf.png

下面我们来模拟实现一下:在这里就是把一个数组中的元素拷贝到另一个数组中。

5ec6c0c7fe1a4b6f956a586b873ac18f.png

我们看模拟实现其实很简单,这里用了指针去完成,只不过我们这里函数返回值类型是void,我们还可以对上述代码进行改进,让它的返回值类型为char*。

7dee1b0718ae49ddb73dc8393810268a.png

我们可以看到优化后的代码更加简洁。

48aefe4837f7456e909fee70b82f08e4.png

3.strcat的使⽤和模拟实现

strcat函数就是将一个字符串追加到另一个字符串的后面。在使用时我们要注意:

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

5.strcat的使⽤需要包含头⽂件<string.h>。

c1de3b643182492a9bf05eb576b66cc8.png

如:c4e7977a06a64a00ba15c9635e550414.png

在这里我们要注意:追加时是在'\0'的后面追加且必须包含'\0'才能追加。如:

f2f5ed7e33024ced82d247fc0e990dc1.png

我们再来深入思考strcat可不可以给自己追加字符串呢?我们可以测试一下:74da7c5f2a3f4c8d8c352677b44d299d.png

我们可以看到也是可以的。

学习完使用后,我们来模拟实现一下:

fff71a0d19f54019b076134a2555a5de.png

这段代码中我们首先要做的就是找到被追加字符串的尾,即:找到'\0',然后再把另一个字符串追加上去,上述代码还能再优化一下。如:b3fc95008a00409ead57ba7c2153e61c.png

4.strcmp的使⽤和模拟实现

strcmp是一个字符串比较函数,使用来比较两个字符串的,函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续执行以后的字符,直到字符不同或达到终止'\0'字符,如果两个字符串相等就返回0,如果第一个字符串比较的字符比第二个字符串字符大就返回大于0的数,反之返回小于0的数。(本质是比较对应字符的ASCII码值大小)

0869c62d6a7c4fa7b50f59facc624ae2.png

如:dd7cca8bd3c2493ea8f97b6b4e40077a.png

学习完使用后,接下来我们来模拟实现一下:

ee964fa130484ff9ba52eda4990e524d.png

上述代码中我们还是串字符串的地址,然后通过指针加1往后一个一个比较字符是否相等。

在这里我们返回的是字符相差的ASCII码值,并没有返回1或-1,这个可以根据需要自己决定。

5.strncpy的使⽤和模拟实现

strncpy和上面strcpy相似却又有不同,我们知道strcpy是一个字符拷贝函数,它可以将整个字符串拷贝到另一个数组中。而strncpy可以指定拷贝几个字符。

在这里我们要注意:

1.拷⻉num个字符从源字符串到⽬标空间;
2.如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。

3c6219fb121448c1a033c2c68ad15434.png

如:1464d9cf0845451a831102ca134984ca.png

strncpy的模拟实现其实就是在strcpy的基础上加了一个参数来控制拷贝字符个数就可以了,下面我们来模拟实现一下:

806a873cef3146818ab0798ae94eb1a0.png

6.strncat的使用和模拟实现

和上面一样strncat也和strcat相似,它可以指定追加字符的个数。使用注意事项也和strcat一样。

9e9853186a0946439196fd7957a67160.png

如:5981d6dfa13046a88499c18c2fbc48ee.png

当然strncat也是可以自己给自己追加字符的:

17a07171dd7748239780f6dea2c9dfd5.png

strncat的模拟实现也是在strcat的基础上加一个参数来控制追加字符的个数,下面我们来模拟实现一下:

2fe771b5a61d4804947c1661b210262a.png

7.strncmp的使用和模拟实现

strncmp也和strcmp相似,它可以指定比较几个字符。

82df9d6ed2be4e4e98a684594daded36.png

如:b4cdf4ffba7e4e638941534b9f5a9885.png

strncmp的模拟实现也仅仅只需加一个参数来控制比较的字符个数就可以了,下面我们来模拟实现一下:63d29c10229f42c79e57a5f0f25d0356.png

8.strstr的使⽤和模拟实现

strstr是一个字符串查找函数,它可以查找一个字符串是否包含在另一个字符串中。如果查找到了就返回str1中首次出现的str2的地址,如果没找到就返回空指针。在使用时我们要注意:

1.函数返回字符串str2在字符串str1中第⼀次出现的位置;

2.字符串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志;

3.包含头文件<string.h>.

cf71a6c0b48e4ecea0ae4480208ab589.png

如:0b73db6c6dfd47deafc75b34ec5e0ac3.png

9c9dff1a591644f991c3e95e694218d1.png

98834b065dec4c8ea19887c6fdc90628.png

下面我们来模拟实现一下:

320e1068fb29412e8667ddc4ffd50004.png

在这里主要的逻辑就是,现在str1中找到str2的第一个字符然后通过指针往后比较两个字符串是否相等,不相等str1就再往后找str2第一个字符在比较,直到找到与str2相等的一串字符,返回第一个字符的地址。当然,字符串匹配问题不止这一个算法,还有一个KMP算法更高效但是不容易理解,感兴趣的小伙伴可以去了解一下,这里不再讲解。

9.strtok函数的使⽤

strtok是一个操作字符串的函数。

char * strtok ( char * str, const char * sep);

1.sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合;

2. 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记。

3.strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容并且可修改。)

4.strtok函数的第⼀个参数为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串中的位置。

5.strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。

6.如果字符串中不存在更多的标记,则返回 NULL 指针。

de88ae14d69d4433a3d0df87da42a91b.png

如:2523706440674a8ba52477c3aaa49252.png

10.strerror函数的使⽤

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
如:51670627188d4fc0989de3db538555d4.png

好了,以上就是本篇文章的全部内容了,感谢大家的观看,如有错误欢迎指正!创作不易,三连支持一下吧!

812dd1a160274e53b45d2b148cd7ba71.gif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

54Max09116-源代码 刚出max的第一个版本

54Max09116-源代码 刚出max的第一个版本 参考资料&#xff1a; 54Max09116-源代码 刚出max的第一个版本_98999NET源码资源网

华为ensp中nat地址转换(静态nat 动态nat NAPT 和Easy IP)配置命令

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月15日12点03分 实验拓扑 接下来我会分几个方面初步将静态nat和napt easy ip 首先基本的环境配置 AR1的基本配置 //基本的IP配置和默认路由指向外网 <Huawei&…

用html写一个有趣的鬼魂动画

<!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>一个有趣的鬼魂动画</title><link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.m…

EV证书——打造高端信任,构建网络信任的坚固屏障

简介 随着网络交易和在线活动的日益频繁&#xff0c;消费者对网络安全和隐私保护的意识不断提高。在这样的背景下&#xff0c;扩展验证&#xff08;Extended Validation, EV&#xff09;证书作为一种更高级别的SSL证书&#xff0c;成为了众多企业尤其是电子商务、金融机构和高…

水水水水水水水水水水水水

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

python爬取京东商品信息与可视化

项目介绍&#xff1a;使用python爬取京东电商拿到价格、店铺、链接、销量并做可视化 ........................................................................................................................................................... 项目介绍效果展示全部…

CentOS7使用Docker搭建Joplin Server并实现多端同步与公网使用本地笔记

文章目录 1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 Joplin 是一个开源的笔记工具&#xff0c;拥有 Windows/macOS/Linux/iOS/Android/Terminal 版本的客户端。多端同步功能是笔记工具最重要的功能&#xff0c;…

WP免费主题下载

免费wordpress模板下载 高端大气上档次的免费wordpress主题&#xff0c;首页大图全屏显示经典风格的wordpress主题。 https://www.wpniu.com/themes/289.html 免费WP主题 蓝色简洁实用的wordpress免费主题模板&#xff0c;免费主题资源分享给大家。 https://www.wpniu.com/…

前端导出excel 接口处理和导出处理

如果按照一般的请求方式&#xff0c;接口会返回如下乱码 此时&#xff0c;接口其实已经请求成功了&#xff0c;只需要对乱码进行一下处理就行 1.请求方式处理 1.1 如果是直接使用axios进行请求 axios({method: get,url: url,params: params,//需要添加responseType: blob }…

永磁同步电机无感FOC(扩展卡尔曼滤波EKF位置观测控制)

文章目录 1、前言2、扩展卡尔曼滤波器原理2.1 预测阶段&#xff08;时间更新阶段&#xff09;2.2 校正阶段&#xff08;状态更新阶段&#xff09; 3、永磁同步电机EKF的模型4、永磁同步电机EKF的无位置状态观测仿真4.1 核心模块&#xff08;在滑膜、龙伯格、磁链等观测器基础上…

一个500路监控的工程项目要如何选择交换机?其实很简单

你们好&#xff0c;我的网工朋友。 前几天我们讲到一台交换机能带动多少网络监控摄像头&#xff0c;这里贴个原文链接《提问&#xff1a;一台交换机能带动多少个网络监控摄像头&#xff1f;》。 那么在构建一个拥有500路监控的庞大工程项目时&#xff0c;我们该如何选择合适的…

【简单讲解如何安装与配置Composer】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

代码随想录——动态规划

系列文章目录 代码随想录——回溯 代码随想录——贪心算法 代码随想录——动态规划 文章目录 系列文章目录概述简单斐波那契数***爬楼梯***使用最小花费爬楼梯不同路径不同路径 II***整数拆分***不同的二叉搜索树***普通0-1背包***分割等和子集***最后一块石头的重量 II***目标…

excel添加折线图,如何将日期作为横坐标?

就这么两列数据&#xff0c;想添加一个以日期为横坐标的折线图&#xff0c;但是出来的折线是这个样子&#xff0c;切换行/列也不行&#xff0c;怎么办呢&#xff1f; 实际上这个折线图中包括两条折线&#xff0c;蓝色的是日期的折线&#xff0c;橙色的是时间的折线&#xff0c;…

6.5V/1.5A线性稳压器负载瞬态响应快可调输出电压

概述 PCD3932 是一款低噪声、低压差线性稳压器 (LDO)&#xff0c;可提供 1.5A 输出电流&#xff0c;最大压降仅为 160mV。该器件提供两种输出电压范围。 PCD3932 的输出电压可通过外部电阻分压器在 0.5V 至 5.5V 范围内进行调节。PCD3932 集低噪声、高 PSRR 和高输出电流能力等…

linux系统USB/IP远程共享USB设备 —— 筑梦之路

概述 USB/IP 是一个开源项目&#xff0c;已合入 Kernel&#xff0c;在 Linux 环境下可以通过使用 USB/IP 远程共享 USB 设备。 USB Client&#xff1a;使用USB的终端&#xff0c;将server共享的usb设备挂载到本地。 USB Server&#xff1a;分享本地的usb设备至远程。 架构原理…

YOLOv8 测试 5-2:Linux 中 Dockerfile 部署 YOLOv8 项目一键运行,Python 封装 API 接口测试

一、前言 记录时间 [2024-4-15] 系列文章简摘&#xff1a; Docker 学习笔记&#xff08;二&#xff09;&#xff1a;在 Linux 中部署 Docker&#xff08;Centos7 下安装 docker、环境配置&#xff0c;以及镜像简单使用&#xff09; API 接口简单使用&#xff08;二&#xff09;…

海外媒体发稿:新加坡 Asia One VS新加坡sg雅虎

海外媒体发稿&#xff1a;新加坡 Asia One VS新加坡sg雅虎 新加坡&#xff1a;雅虎 官网&#xff1a;sy.yahoo.com 官网&#xff1a;asiaone.com/lite 亚洲第一站。是 新加坡的新闻和生活方式网站和新闻聚合器。它是 新加坡第一个纯数字 内容平台&#xff0c;主要为新加坡、…

【攻防世界】bug

垂直越权IP绕过文件上传 文件上传绕过&#xff1a; 1. mime检测 2. 大小写绕过 3. 等价替换&#xff08;php5&#xff0c;php3&#xff09; 4. 利用JavaScript执行php代码&#xff08;正常的php代码会被检测到&#xff0c;所以就用JavaScript来执行&#xff09; <script lan…

docker特殊问题处理3——docker-compose安装配置nacos

最近几年随着大数据和人工智能持续大热&#xff0c;容器化安装部署运维已经走进了各个中小公司&#xff0c;也得已让众多开发者能上手实际操作&#xff0c;不过说真心话&#xff0c;“万物皆可容器化”的理念越来越深入人心。 而如何使用docker-compose安装&#xff0c;配置&a…