c语言-字符函数和字符串函数详解

文章目录

    • 1. 字符分类函数
    • 2. 字符转换函数
    • 3. strlen的使用和模拟实现
    • 4. strcpy的使用和模拟实现
    • 5. strncpy函数的使用
    • 6. strcat的使用和模拟实现
    • 7. strncat函数的使用
    • 8. strcmp的使用和模拟实现
    • 9. strncmp函数的使用
    • 10. strstr的使用和模拟实现
    • 11. strtok函数的使用
    • 12. strerror函数的使用


以下这些字符函数和字符串函数都可以通过这个网站找到详细的介绍:https://legacy.cplusplus.com/

1. 字符分类函数

作用:用于判断一个字符是属于什么类型的字符
头文件:#include<ctype.h>
列举:
在这里插入图片描述

我们这里使用一个 islower 函数判断一个字符是不是字母小写

int islower ( int c );

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

代码:

#include<ctype.h>
#include<stdlib.h>
int main() {char a = getchar();if (islower(a))printf("小写");elseprintf("其他");return 0;
}

运行结果:
在这里插入图片描述
其他的类似也这样判断

2. 字符转换函数

还有将字母小写互换大写字符函数,如:

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

我们来试试:

#include<ctype.h>
#include<stdlib.h>
int main() {char a = getchar();if (islower(a)) {char b = toupper(a);printf("%c\n", b);}elseprintf("输入的不是小写字母");return 0;
}

运行结果:
在这里插入图片描述

3. strlen的使用和模拟实现

参数和返回类型:

 size_t strlen ( const char * str );

1.字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数(不包 含 ‘\0’ )。
2. 参数指向的字符串必须要以 ‘\0’ 结束。
3.注意函数的返回值为size_t,是⽆符号的( 易错 )。
4. strlen的使⽤需要包含头⽂件(string.h)。

使用:

#include<string.h>//包含头文件
int main() {char* a = "abcdef";size_t  te = strlen(a);//计算字符串中‘\0之前的元素个数,注意返回类型为size_tprintf("%zd\n", te);//打印return 0;
}

运行结果:
在这里插入图片描述

模拟 strlen 函数

1.我们创建一个函数,参数用来接收字符串的首地址,返回类型和strlen一样为 size_t
2.我们设置一个计数器来计算字符个数,通过循环来遍历字符串,每遍历一次计数器就++,直到遇到‘\0’为止

代码:

size_t mn_strlen1(const char* s) {//我们不希望改变字符串 所以用const修饰,s用来接收首地址int i = 0;//计数器assert(s);while (*s) {//当*s为'\0'时打破循环i++;s++;//字符地址++}return i;//返回
}
int main() {char a[] = "abcdef";size_t len1 = mn_strlen1(a);printf("%zd\n", len1);return 0;
}

运行结果:
在这里插入图片描述

4. strcpy的使用和模拟实现

参数和返回类型:

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

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

使用:

#include<string.h>//包含头文件
int main() {char a[20] = { 0 };//目标空间一定要够大char b[] = "abcdef";//字符串的‘\0'也会拷贝char* p = strcpy(a, b);//用p来接收返回来的地址printf("%s\n", p);//打印return 0;
}

运行结果:
在这里插入图片描述
模拟 strcpy函数
1.我们创建一个函数,参数分别为目标空间的地址和源字符串地址,返回为目标空间的首地址
2.我们可以先创建一个指针变量来记住目标空间的首地址,然后将源字符串中的每一个字符都传到目标空间里直到传完’\0’为止,最后返回目标空间首地址
实现代码:

//strcpy模拟实现
char* mn_strcpy(char* p1, const char* p2) {//我们不希望改变字符串p2 所以用const修饰,p1为目标空间的首地址,p2为源字符串首地址assert(p1);//防止为NULLassert(p2);char* p = p1;//保存目标空间首地址while (*p1=*p2) {//解引用将*p2的字符赋给*p1p1++;//地址加加p2++;}return p;//返回目标空间首地址}
int main() {char a[20] = { 0 };char b[] = "abcdef";
char*p=mn_strcpy(a, b);printf("%s\n", p);return 0;
}

运行结果:

在这里插入图片描述

5. strncpy函数的使用

参数和返回类型:

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

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

使用:

int main() {char a[20] = {0};char b[] = "abcde";printf("%s\n", strncpy(a, b,3));//只拷贝三个return 0;
}

运行结果:
在这里插入图片描述

6. strcat的使用和模拟实现

参数和返回类型:

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

作用:将源字符串连接到目标字符串上
1.源字符串必须以 ‘\0’ 结束。
2.⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
3.⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
4.⽬标空间必须可修改。

使用:

#include<string.h>//包含头文件
int main() {char a[20] = "qwe";//目标空间一定要够大char b[] = "abcdef";char* p = strcat(a, b);//用p来接收返回来的地址printf("%s\n", p);//打印return 0;
}

运行结果:
在这里插入图片描述
模拟strcat函数

1.我们创建一个函数,参数分别为目标空间的地址和源字符串地址,返回为目标空间的首地址
2.我们先创建一个指针变量来储存目标空间的首地址,再用循环来遍历目标空间的字符串直到找到\0’,停止
3.将源字符串中的每一个字符都传到目标空间里直到传完’\0’为止,最后返回目标空间首地址

实现代码:

//strcat模拟
char* nm_strcat(char* p1, const char* p2) {//我们不希望改变字符串p2 所以用const修饰,p1为目标空间的首地址,p2为源字符串首地址char* p = p1;//保存目标空间首地址assert(p1);assert(p2);while (*p1)//遍历*p直到找到‘/0’p1++;while (*p1=*p2) {///解引用将*p2的字符赋给*p1p1++;p2++;}return p;//返回目标空间首地址
}
int main() {char a[20] ="grr";char b[] = "abcdef";char*p=nm_strcat(a, b);printf("%s\n", p);return 0;
}

运行结果:
在这里插入图片描述

7. strncat函数的使用

参数和返回类型:

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

1.将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字符
2.如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到\0 的内容追加到destination指向的字符串末尾

使用:

int main() {char a[20] = "xxx";char b[] = "abcde";printf("%s\n", strncat(a, b,3));return 0;
}

运行结果:
在这里插入图片描述

8. strcmp的使用和模拟实现

参数和返回类型:

int  strcmp(comst char * destination, const char * source );

第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。

使用:

#include<string.h>//包含头文件
int main() {char a[] = "abfa";//char b[] = "abqc";int t = strcmp(a, b);if (t == 0)printf("a=b");else if (t > 0)printf("a>b");elseprintf("a<b");return 0;
}

比较过程图:
在这里插入图片描述
运行结果:
在这里插入图片描述
模拟strcmp函数

1.我们创建一个函数,参数分别接收两个字符串的首地址,返回 int的数据
2.通过循环将两个字符串一一对比,直到出现不相等或者都为‘\0’的情况

代码实现:

int mn_strcmp(const char* p1, const char* p2) {//	我们不希望改变字符串p2 和p1所以用const修饰,p1为目标空间的首地址,p2为源字符串的首地址assert(p1);//防止为NULLassert(p2);while (*p1 == *p2) {//相等就继续比较if (*p1 == '\0')//当双方都是\0时就是两字符串相等return 0;p1++;p2++;}return *p1 - *p2;//p1>pp2时返回正值,否则反之
}
int main() {char* a = "ger";char* b = "ger";int t = mn_strcmp(a, b);if (t == 0)printf("a=b");else if (t > 0)printf("a>b");elseprintf("a<b");return 0;
}

运行结果:
在这里插入图片描述

9. strncmp函数的使用

参数和返回类型:

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

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

使用:

int main() {char* a = "gerqq";char* b = "gera";int t = strncmp(a, b,3);//比较前三个字符if (t == 0)printf("a=b");else if (t > 0)printf("a>b");elseprintf("a<b");return 0;
}

运行结果:
在这里插入图片描述

10. strstr的使用和模拟实现

参数和返回类型:

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

作用:查找str1中str2
1.函数返回字符串str2在字符串str1中第⼀次出现的位置
2.字符串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志

使用:

#include<string.h>//包含头文件
int main() {char a[] = "abcdfa";//char b[] = "cd";//char* p = strstr(a, b);//在a字符串中找b字符串,找到之后返回找到时在a的地址printf("%s\n", p);return 0;
}

运行结果:
在这里插入图片描述
模拟strsstr函数

1.我们创建一个函数,参数分别接收两个字符串的首地址,返回 查找成功时的地址
2.第一种情况就是查找的字符串为NULL此时我们直接返回目标字符串,第二我们需要设置三个指针,其中一个记录目标字符串移动到的位置,还有两个分别进行遍历,找到相同就继续,不同就跳出,跳出后记录指针就++,再进行下一次遍历,直到找到源字符串的’\0‘就算查找成功,不然就找不到

代码实现:

char* mn_strstr(const  char* p1, const char* p2) {assert(p1);//	我们不希望改变字符串p2 和p1所以用const修饰,p1为目标空间的首地址,p2为源字符串的首地址if (!*p2)//源字符串为NILL时直接返回p1return p1;char* con = p1;//记录指针,从第一个位置开始char* s1 = NULL;//空char* s2 = NULL;//while (*con) {//当将目标字符串都找一次还没有就返回NULLs1 = con;//目标字符移动指针s2 = p2;//源字符移动指针while ((*s1 == *s2) && *s2) {//对比,当s2为'\0'时结束s1++;s2++;}if (*s2 == '\0')return con;con++;}return NULL;
}int main() {char* a = "cdf";char* b = "cqf";char* p = mn_strstr(a, b);if (!p)printf("找不到\n");elseprintf("%s\n", p);return 0;
}

运行结果:
在这里插入图片描述

11. 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 指针

使用:

#include <stdio.h>
#include <string.h>
int main()
{char arr[] = "192.168.6.111";char* sep = ".";//作为分割符char* str = NULL;//等会作接收返回值for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}return 0;
}

运行结果:
在这里插入图片描述

12. strerror函数的使用

参数和返回类型:

char * strerror ( int errnum );

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

使用:

#include <errno.h>
#include <string.h>
#include <stdio.h>
//我们打印⼀下0~10这些错误码对应的信息
int main()
{int i = 0;for (i = 0; i <= 10; i++) {printf("%s\n", strerror(i));}return 0;
}

运行结果:
在这里插入图片描述

以上就是我的分享了,如果有什么错误,欢迎在评论区留言。
最后,谢谢大家的观看!

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

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

相关文章

【尚跑】2023宝鸡马拉松安全完赛,顺利PB达成

1、赛事背景 千年宝地&#xff0c;一马当先&#xff01;10月15日7时30分&#xff0c;吉利银河2023宝鸡马拉松在宝鸡市行政中心广场鸣枪开跑。 不可忽视的是&#xff0c;这次赛事的卓越之处不仅在于规模和参与人数&#xff0c;还在于其精心的策划和细致入微的组织。为了确保每位…

Kotlin学习——kt里面的函数,高阶函数 函数式编程 扩展函数和属性

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

论文笔记:详解NEUPSL DSI

《Using Domain Knowledge to Guide Dialog Structure Induction via Neural Probabilistic 》 名词解释 Dialog Structure Induction&#xff08;DSI&#xff09;是推断给定目标导向对话的潜在对话结构&#xff08;即一组对话状态及其时间转换&#xff09;的任务。它是现代对…

基于Scapy修改ClientHello的SNI(三)

需求:修改HTTPS的ClientHello中的SNI字段 目标:修改成功,wireshark显示正常 语言:Python 三方库:Scapy 下面是一个标准的ClientHello报文,是从一个完整的HTTPS流中保存出来的,原始报文中的SNI是www.baidu.com 在上一篇文章中 记录基于scapy构造ClientHello报文的尝试…

【Docker】Docker与Kubernetes:区别与优势对比

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。   kubernetes&#xff0c;简称K8s&a…

C#调用ffmpeg从视频提取图片

微信公众号“CSharp编程大全”的文章《C#从视频提取图片&#xff1f;》介绍了基于Microsoft.DirectX.AudioVideoPlayback.Video类实现从视频提取图片的方式&#xff0c;本来是想学习并测试该类的用法&#xff0c;但实际测试过程中却没有测通。百度从视频提取图片&#xff0c;网…

【Leetcode合集】1457. 二叉树中的伪回文路径

1457. 二叉树中的伪回文路径 1457. 二叉树中的伪回文路径 代码仓库地址&#xff1a; https://github.com/slience-me/Leetcode 个人博客 &#xff1a;https://slienceme.xyz 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&am…

rtsp点播异常出现‘circluar_buffer_size‘ option was set but it is xx

先说现象: 我使用potplay播放器来点播rtsp码流的时候可以点播成功&#xff0c;同事使用vlc和FFplay来点播rtsp码流的时候异常。 排查思路: 1.开始怀疑是oss账号问题&#xff0c;因为ts切片数据是保存在oss中的&#xff0c;我使用的是自己的oss账号&#xff0c;同事使用的是公司…

芯片安全和无线电安全底层渗透技术

和传统网络安全不同&#xff0c;硬件安全、芯片安全、无线电安全属于网络底层安全的重要细分领域&#xff0c;是网络安全的真正基石&#xff0c;更是国家安全的重要组成部分&#xff0c;“夯实网络底层安全基础&#xff0c;筑牢网络强国安全底座”&#xff0c;是底网安全重要性…

【小沐学写作】原型设计工具汇总(Axure RP)

文章目录 1、简介2、Axure RP2.1 工具简介2.2 工具特点2.2.1 互动事件2.2.2 条件逻辑2.2.4 工作表格2.2.5 多状态容器2.2.6 数据驱动接口2.2.7 自适应视图2.2.8 流程图 2.3 工具安装2.3.1 安装2.3.2 运行 2.4 使用费用2.5 工具体验2.5.1 登陆框制作 3、其他3.1 Figma3.2 Adobe …

如何通过ShardingJDBC进行读写分离

背景信息&#xff1a; 面对日益增加的系统访问量&#xff0c;数据库的吞吐量面临着巨大瓶颈。 对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说&#xff0c;将数据库拆分为主库和从库。其中主库负责处理事务性的增删改操作&#xff0c;从库负责处理查询操作&#…

实验题【网关设置+VRRP+OSPF】(H3C模拟器)

嘿&#xff0c;这里是目录&#xff01; ⭐ H3C模拟器资源链接1. 实验示意图2. 要求和考核目标3. 当前配置3.1 PC1、PC2、PC3、PC4和PC5配置3.2 SW配置3.2.1 SW2配置3.2.2 SW3配置3.2.3 SW4配置3.2.4 SW1配置 3.2. R配置3.2.1 R1配置3.2.2 R2配置 ⭐ H3C模拟器资源链接 H3C网络…

微服务学习|初识MQ、RabbitMQ快速入门、SpringAMQP

初识MQ 同步通讯和异步通讯 同步通讯是实时性质的&#xff0c;就好像你用手机与朋友打视频电话&#xff0c;但是&#xff0c;别人再想与你视频就不行了&#xff0c;异步通讯不要求实时性&#xff0c;就好像你用手机发短信&#xff0c;好多人都能同时给你发短信&#xff0c;你…

xadmin后台在每一行记录增加一个复制链接按钮

xadmin后台在每一行记录增加一个复制链接按钮 1、效果 点击复制后,自动把url链接复制到粘贴板,按Ctrl+v即可显示复制内容。 2、实现代码 adminx.py # 用户管理 class UserWhiteListAdmin(object):search_fields = [name, mobile] # 检索字段list_display

在家无聊想获取收益?这几种副业项目分享给你

总会有在家无聊的时候&#xff0c;特别是一些很“宅”的人。厌倦了一些娱乐方式后&#xff0c;想起生活经济上的压力&#xff0c;这时候就会想到要做些什么获取收益。 是的&#xff0c;不用出门&#xff0c;不用和别人面对面交流&#xff0c;时间自由可控&#xff0c;这就是在家…

Fedora 36 ARM 镜像源更换与软件安装

1、什么是Fedora Fedora Linux是较具知名度的Linux发行套件之一&#xff0c;由Fedora专案社群开发、红帽公司赞助&#xff0c;目标是建立一套新颖、多功能并且自由的作业系统。 Fedora是商业化的Red Hat Enterprise Linux发行版的上游原始码。 2、Fedora软件安装 64 位 .deb&a…

elementPlus之home页面布局

可以根据自己喜欢的格式选择 现在 header 部分 Aside 部分 Main部分 加上背景色以及命名 <template><div class="common-layout"><el-container><el-header class="homeHeader"><div class="headerTitle">Dev…

栈和队列的实现(详解+图解!文末附完整代码)

栈 栈的基本概念 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#xff1a;栈的…

macos安装小软件 cmake

一&#xff0c;cmake下载主页 Download CMake 二&#xff0c;下载&#xff0c;解压&#xff0c;配置&#xff0c;编译&#xff0c;安装 0. 假设macos中已经存在了 clang和make工具 1. 通过网页下载最新的稳定版 cmake***.tar.gz 源代码 2. tar zxf cmake***.tar 3. cd cmake***…

iOS强引用引起的内存泄漏

项目中遇到一个问题&#xff1a; 1.在A页面的ViewDidLoad 方法里写了一个接收通知的方法&#xff0c;如下图&#xff1a; 然后在B页面发送通知 &#xff08;注&#xff1a;下图的NOTI 是 [NSNotificationCenter defaultCenter] 的宏&#xff0c; 考虑一下可能有小白看这篇文章…