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.hqwc.cn/news/217966.html

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

相关文章

【数据处理】 -- 【两分钟】了解【最好】的方式 -- 【正则表达式】

直接匹配&#xff1b; 普通字符 元匹配&#xff1a; . 任意单字符 r’表示单引号里字符为其特殊含义&#xff0c;比如.不是句号是匹配符的意思 *任意次数&#xff08;换行结束&#xff09; 一次及以上 {3,4}指定次数,至少3次&#xff0c;最多4次|{3}固定4次 [\d.]单个任意…

位图及有关海量数据处理

bitset 1.给40亿个不重复的无符号整数&#xff0c;没排过序&#xff0c;给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个中 ①.如果用排序加二分查找&#xff0c;40亿个数需要16g内存&#xff0c;内存开不出这么大连续空间 ②.每个值映射一个比特位&#xff0c;…

用AI工具3分钟整理并制作出一本书的思维导图

本期教大家快速用AI工具制作出精美的思维导图。 1.用ChatGPT总结出书本内容 首先打开ChatGPT&#xff0c;在对话框中输入你想要它生成的内容&#xff0c;并且要求他以markdown代码的格式输出&#xff0c;只需要几十秒的时间。整本书的框架思维导图就生成了&#xff0c;你还可以…

【后端卷前端】

为啥现在对后端要求这么高?为啥不要求前端会后端呢? 可能是后端人太多了,要求后端需要会前端的框架(vue react angular ), 这不我为了适应市场的需求来系统的学习vue了: 生成一个基础的vue项目 创建vue项目 vue create projectname 创建vitevue npm init vitelatest p…

Jenkins 整合 Docker 自动化部署

Docker 安装 Jenkins 配置自动化部署 1. Docker 安装 Jenkins 1.1 拉取镜像文件 docker pull jenkins/jenkins1.2 创建挂载文件目录 mkdir -p $HOME/jenkins_home1.3 启动容器 docker run -d -p 8080:8080 -v $HOME/jenkins_home:/var/jenkins_home --name jenkins jenkin…

浅谈现代化城市建设中智慧消防的研究与应用

安科瑞 华楠 【摘要】随着城市现代化发展&#xff0c;城市居住密度愈来愈大&#xff0c;城市建筑结构复杂多样化&#xff0c;高层建筑火灾发生率在不断地升高。对现代化城市面临的消防问题展开讨论&#xff0c;针对智慧消防在现代化城市建设中的现状进行了分析&#xff0c;并提…

使用bard分析视频内容

11月21日的bard update 更新了分析视频的功能&#xff0c;使用方法如下&#xff1a; 1、打开bard网站。https://bard.google.com/ 2、点击插件。 3、点击YouTube中的 research a topic 选项。 4、输入需要分析的内容&#xff1a; Please analyze how many technologies are in…

安卓系统修图软件(一)

平时我们会不时在朋友圈发自己的自拍照&#xff0c;或者是风景图等&#xff0c;许多小伙伴们此时会对照片进行一定的修理&#xff0c;比如添加滤镜等操作。在电脑上用ps修图比较繁琐&#xff0c;日常中大可不必用这把宰牛刀&#xff1b;而手机自带的编辑器&#xff0c;或者是QQ…

4.28每日一题(二重积分比较大小:被积函数的大小、正负性、积分区间奇偶性)

一般比较大小的题目我们不需要把结果全部计算出来 &#xff0c;而是通过奇偶性或者被积函数的大小或大于0、等于0、小于0等方法判断比较

JVM中如何实现垃圾收集

Java虚拟机&#xff08;JVM&#xff09;使用垃圾收集器&#xff08;Garbage Collector&#xff09;来管理内存&#xff0c;清理不再使用的对象以释放内存空间。垃圾收集的主要目标是自动化内存管理&#xff0c;使开发人员无需显式地释放不再使用的内存&#xff0c;从而降低了内…

浏览器缓存控制讲解

缓存的作用 在你访问互联网中的任何资源其所产生的任何链路中的每一个节点几乎都会进行缓存&#xff0c;整个缓存体系和细节十分复杂。比如浏览器缓存&#xff0c;服务器缓存&#xff0c;代理服务器缓存&#xff0c;CDN缓存等。 但是缓存又十分重要&#xff0c;不可缺少&…

不会做UI自动化测试?一起设计框架再实践吧

目的 相信做过测试的同学都听说过自动化测试&#xff0c;而UI自动化无论何时对测试来说都是比较吸引人的存在。 相较于接口自动化来说它可以最大程度的模拟真实用户的日常操作与特定业务场景的模拟&#xff0c;那么存在即合理&#xff0c;自动化UI测试自然也是广大测试同学职…