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

目录:

1. 字符分类函数

2. 字符转换函数

3. strlen的使用和模拟实现

4. strcpy的使用和模拟实现

5. strcat的使用和模拟实现

6. strcmp的使用和模拟实现

7. strncpy函数的使用

8. strncat函数的使用

9. strncmp函数的使用

10. strstr的使用

11. strtok函数的使用

12. strerror函数的使用


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

1. 字符分类函数

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

b2525feee1ff434f85bc7553737cea87.png

这些函数的使用方法非常类似,我们就讲解⼀个函数,其他的非常类似:

int islower ( int c );

 islower

是能够判断参数部分的 c 是否是小写字母的。 通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回 0。

练习: 写⼀个代码,将字符串中的小写字母转大写,其他字符不变。

b6dd95f1cbdc467faf7f3704cb7ca877.png

2. 字符转换函数

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

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

同样是上面的问题,将字符串中的小写字母转大写,有了转换函数,就可以直接使⽤ tolower 函 数。为:

c866ef8b99ea4675acb3d0306ce75671.png

3. strlen的使用和模拟实现 

size_t strlen ( const char * str );

• 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数

• 参数指向的字符串必须要以 '\0' 结束。

• 注意函数的返回值为size_t,是无符号的( 易错 )

• strlen的使用需要包含头文件<string.h>

------判断下面代码会输出什么结果?

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

 结果为:

39ca832c0082454f866237cc046eb95b.png

因为 函数的返回值为size_t,是无符号的!!

• 学会strlen函数的模拟实现 

方式1:

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

方式2:

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

方式3:

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

4. strcpy 的使用和模拟实现

char* strcpy(char * destination, const char * source );
               //   目的地   <-------------- 来源 

• 源字符串必须以 '\0' 结束。

• 会将源字符串中的 '\0' 拷贝到目标空间。

• 目标空间必须足够⼤,以确保能存放源字符串。

• 目标空间必须可修改。

用于拷贝字符串,简单使用:

25ebf6d1216a4b63b169386237d4bead.png

strcpy的模拟实现:

//1.参数顺序
//2.函数的功能,停⽌条件
//3.assert
//4.const修饰指针
//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 的使用和模拟实现

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

• 源字符串必须以 '\0' 结束。

• 目标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。

• 目标空间必须有足够的⼤,能容纳下源字符串的内容。

• 目标空间必须可修改

用于连接字符串,简单使用:

d0919112d6d744dda7076ac01925f8bc.png

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 的使用和模拟实现

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

•第⼀个字符串大于第⼆个字符串,则返回大于0的数字

•第⼀个字符串等于第⼆个字符串,则返回0

•第⼀个字符串小于第⼆个字符串,则返回小于0的数字

•那么如何判断两个字符串? 比较两个字符串中对应位置上字符ASCII码值的大小。

简单使用:

edbb8b5313864e3cb705a74fc2113b07.png

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')
 return 0;
 str1++;
 str2++;
 }
 return *str1-*str2;
}

strcpy,strcat,strcmp为长度不受限制的字符串函数

strncpy,strncat,strncmp为长度受限制的字符串函数

7. strncpy函数的使用

char * strncpy ( char * destination, const char * source, size_t num );

• 拷贝num个字符从源字符串到⽬标空间。

• 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

简单使用:

ab03f2786c2b4704a79753556a31b82d.png

8. strncat 函数的使用 

char * strncat ( char * destination, const char * source, size_t num );

 • 将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字符

 • 如果source 指向的字符串的长度小于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾

简单使用:

84570f4961ef41f288e6691b386c54b0.png

dbc4dd8cda624bb6979c4278439dec04.png

9. strncmp函数的使用

int strncmp ( const char * str1, const char * str2, size_t num );

比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字⺟,如果提前发现不一样,就提前结束,⼤的字符所在的字符串大于另外⼀个。如果num个字符都相等,就是相等返回0.

简单使用:

8eca28b7ab764f7ba9785703fceb3f02.png

10. strstr 的使用和模拟实现

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

//从一个字符串str1中查找另一个字符串str2 

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

•字符串的比较匹配不包含 \0 字符,以 \0 作为结束标志

简单使用:

8b3e73d5c9684571b3846b53e3980d12.png

未找到返回空指针

508ba7a8cc7643e9839f95ab3cf4a054.png

11. strtok 函数的使用

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

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

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

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

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

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

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

简单使用:

5dd6825416db491ea59b5a7a377ab8cd.png

12. strerror 函数的使用

char * strerror ( int errnum );

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

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

在Windows11+VS2022环境下输出的结果如下

52067c58c7b444998802aede97c8ab73.png

举例:

735337586e80440b8bac6dd13592297d.png

也可以了解⼀下perror函数,perror函数相当于⼀次将上述代码中的第9行完成了,直接将错误信息打 印出来。perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。

6e9529e353f440178727141f2a2ae9b4.png

分享到这里,感谢观看

 

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

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

相关文章

数据库 06-03 时间戳,多版本MVCC,快照隔离,幻读

01.什么是时间戳 “时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 02.用时间戳实现调度 定义 数据库给予一个事务一个时…

美国B2987A是德科技静电计

181/2461/8938产品概述&#xff1a; 图形皮安计/静电计&#xff0c;可自信地测量低至0.01 fA和高达10 PΩ的电流 是德科技B2981A和B2983A毫微微/皮安计以及B2985A和B2985A静电计/高阻计不仅提供同类最佳的测量性能&#xff0c;还提供前所未有的功能来最大限度地提高您的测量信…

网络广播系统是什么?网络广播的作用及应用

网络广播系统是什么?网络广播的作用及应用 商场广播的目的&#xff1a;提醒人员有序、监控配合点对点呼叫、物品遗失广播、背景音乐防噪、紧急情况呼叫等等&#xff0c;各个场景有各个场景的需求模式&#xff0c;广播系统的建设重点在于突发情况的应对&#xff0c;国家已经把广…

更改el-cascade默认的value和label的键值

后端返回的树结构中&#xff0c;label的key不是el-cascade默认的label&#xff0c;我需要改成对应的字段&#xff0c;但是一直没有成功&#xff0c;我也在文档中找到了说明&#xff0c;但是我没注意这是在props中改&#xff0c;导致一直不成功 这是我一开始错误的写法&#xf…

vue快速入门(十二)v-key索引标志

注释很详细&#xff0c;直接上代码 上一篇 新增内容 v-key的使用场景数组筛选器的使用 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, i…

03-JAVA设计模式-适配器模式

适配器模式 设么是适配器模式 它属于结构型模式&#xff0c;主要用于将一个类的接口转换成客户端所期望的另一种接口&#xff0c;从而使得原本由于接口不兼容而无法协同工作的类能够一起工作。 适配器模式主要解决的是不兼容接口的问题。在软件开发中&#xff0c;经常会有这…

C#操作MySQL从入门到精通(6)——对查询数据进行排序

前言 在和MySql数据库交互的过程中,查询数据是使用最频繁的操作,并且我们经常需要对查询到的数据进行排序后输出,比如我想查询1列数据的最小值,那么我可以将查询到的数据进行升序(从小到大)排列,然后取第一个数据就是最小值。本文详细介绍了对查询数据进行排序的各种操…

第一届长城杯初赛部分wp(个人解题思路)

目录 Black web babyrsa2 APISIX-FLOW cloacked 本人不是很擅长ctf&#xff0c;这只是我自己做出的西部赛区部分题的思路&#xff0c;仅供参考 Black web 访问http://192.168.16.45:8000/uploads/1711779736.php 蚁剑连接 访问/var/www/html/u_c4nt_f1nd_flag.php babyr…

C语言 | Leetcode C语言题解之第17题电话号码的字母组合

题目&#xff1a; 题解&#xff1a; char phoneMap[11][5] {"\0", "\0", "abc\0", "def\0", "ghi\0", "jkl\0", "mno\0", "pqrs\0", "tuv\0", "wxyz\0"};char* digits…

Win11 使用 WSL2 安装 linux 子系统 ubuntu,删除 linux 子系统 ubuntu

Win11 使用 WSL2 安装 linux 子系统 ubuntu&#xff0c;删除 linux 子系统 ubuntu 1、用 部署映像服务和管理工具 dism.exe 命令&#xff0c;开启 WSL2 按【WIN R】&#xff0c;打开【运行】&#xff0c;输入&#xff1a;【cmd】&#xff0c;管理员打开【命令行提示符】。 …

Vue项目打包配置生产环境去掉console.log语句的方法

一、Vue2项目 使用webpack内置的 terser 工具&#xff0c;在vue.config.js文件加上相应的配置即可。 二、Vue3项目 同样是使用 terser 工具&#xff0c;不过vite没有内置terser&#xff0c;需要手动安装依赖 安装完后在vite.config.js文件加上相应的配置即可。 2024-4-9

SWM341系列应用(RTC、FreeRTOS\RTTHREAD应用和Chip ID)

SWM341系列RTC应用 22.1、RTC的时钟基准 --liuzc 2023-8-17 现象:客户休眠发现RTC走的不准&#xff0c;睡眠2小时才走了5分钟。 分析与解决&#xff1a;经过排查RTC的时钟源是XTAL_32K&#xff0c;由于睡眠时时设置XTAL->CR0&#xff1b;&#xff0c;会把XTAL_32K给关…

AIoT人工智能物联网----刷机、系统安装、示例、摄像头等

软件链接见文末 1. jetson nano硬件介绍 载板 模组卡座:放置核心板 micro SD卡接口:插SD卡,将操作系统写入SD卡,然后插入;建议至少为32GB。当然根据使用情况可以是64GB;卡的质量一定要好,读写速度快。之前买了同品牌128G的比64G的慢很多。所以大小合适就好M.2 Key E …

Matlab进阶绘图第50期—气泡堆叠蝴蝶图

气泡堆叠蝴蝶图是堆叠蝴蝶图与气泡图的组合—在堆叠蝴蝶图每根柱子上方添加大小不同的气泡&#xff0c;用于表示另外一个数据变量&#xff08;如每根柱子各组分的平均值&#xff09;的大小。 本文利用自己制作的BarBubble工具&#xff0c;进行气泡堆叠蝴蝶图的绘制&#xff0c…

Redis 详细考点

Redis 哪些地方用到 Redis 点赞、关注、登录验证码、登录的凭证、用户 redis 的 key 设计 package com.conquer.community.util;import com.conquer.community.entity.User;public class RedisKeyUtil {private static final String SPLIT ":";private static f…

ArcGIS Desktop使用入门(四)工具箱——属性域

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

实时多目图像拼接算法

实时多目图像拼接算法可以用于将多个视角的图像拼接成一个全景图像或者视频。 以下是一种常见的实时多目图像拼接算法的基本实现步骤: 特征提取与匹配: 对于每个输入图像,使用特征提取算法(如SIFT、ORB等)来提取图像中的特征点。然后,使用特征描述符(如ORB描述符)来描述…

《自动化办公》Python-操控-Word

虽然Word不好用, 但还必须得用它, python-docx是专门用于编辑Word文档的一个工具库, 它有两大用途, 自动化生成word文档 and 自动化修改文档 1. 自定义样式 python可以自定义三类样式 段落样式字符样式表格样式(一般用不到) 这三类样式的创建方式基本一致, 只是创建参数 略有不…

C++11:超进化--lambda表达式

目录 一、lambda表达式的引入 二、lambda表达式的语法 2.1lambda表达式各部分说明 2.2lambda函数的初步使用 2.3详谈捕捉列表 2.3.1[var][&var] 2.3.2[]传值捕捉当前域所有对象 2.3.3[&]传引用捕捉所有对象 2.3.4[&,val]混合捕捉 ​编辑 三、lambda底层、la…

windows远程桌面RDP提示登录密码失败次数过多帐户被锁定的解决方法

网上说的那些都不靠谱&#xff0c;乱来的&#xff0c;其实很简单&#xff0c;在计算机地址栏IP或域名后面空格加上“/admin”就可以登录进去&#xff0c;意思应该是以管理员的身份登录进去&#xff0c;这个用户必须要有管理员的权限&#xff0c; 这个操作秘密真的是深藏不露啊…