字符和字符串操作函数总结

索引

  • 一 . 字符操作函数
    • 1. 字符分类函数
    • 2. 字符转换函数
  • 二 . 字符串操作函数
    • 长度不受限制的字符串操作函数
      • 1. strcpy函数的使用和模拟实现
      • 2. strcat函数的使用和模拟实现
      • 3. strcmp函数的使用和模拟实现
    • 长度受限制的字符串操作函数
      • 1. strncpy函数的使用
      • 2. strncat函数的使用
      • 3. strncmp函数的使用
    • 其它常用字符串操作函数
      • 1. strlen函数的使用和模拟实现
      • 2. strstr函数的使用和模拟实现
      • 3. strtok函数的使用
      • 4. strerror函数的使用
        • perror函数
  • 三 . 总结


正文开始

一 . 字符操作函数

1. 字符分类函数

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

函数如下:

在这里插入图片描述

这些函数的使用方法非常类似 , 我们就列举一个函数 , 其它非常的类似:

int islower ( int c );

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

写一个代码, 将字符串中的小写字母转为大写, 其他字符不变

#include<stdio.h>
#include<ctype.h>
int main()
{char str[] = "TEst StrinG.\n";int i = 0;while (str[i]){if (islower(str[i]))//当然这里也可以不用判断,直接转换,只不过代码运行效率不高{str[i] = str[i] - 32;}i++;}printf("%s\n", str);return 0;
}

2. 字符转换函数

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

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

上面的代码,我们将小写转大写,是-32完成的效果,有了转换函数,就可以直接使用 tolower 函数。

#include<stdio.h>
#include<ctype.h>
int main()
{char str[] = "TEst StrinG.\n";int i = 0;while (str[i]){if (islower(str[i])){str[i] = toupper(str[i]);}i++;}printf("%s\n", str);return 0;
}

二 . 字符串操作函数

长度不受限制的字符串操作函数

1. strcpy函数的使用和模拟实现

函数介绍:

char* strcpy(char * destination, const char * source );• 源字符串必须以 '\0' 结束。
• 会将源字符串中的 '\0' 拷⻉到⽬标空间。
• ⽬标空间必须⾜够⼤,以确保能存放源字符串。
• ⽬标空间必须可修改。
• 学会模拟实现

strcpy函数的模拟实现:

char* my_strcpy(char* str1, char* str2)//把str2中的内容拷贝到str1中
{assert(str1 != NULL);assert(str2 != NULL);char* s = str1;while (*str2 != '\0') {*str1 = *str2;str1++;str2++;}*str1 = *str2;return s;
}
//优化版本char* my_strcpy(char* str1, const char* str2)
{assert(str1 != NULL);assert(str2 != NULL);char* s = str1;while (*str1++ = *str2++);return s;
}

2. strcat函数的使用和模拟实现

函数介绍:

char *strcat(char *dest, const char*src);• 源字符串必须以 '\0' 结束。
• ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
• ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
• ⽬标空间必须可修改。

strcat函数的模拟实现

char* my_strcat(char* str1,const char* str2)//把str2中的数据拼接到str1
{assert(str1 && str2);char* s = str1;while (*str1 != '\0')str1++;while (*str1++ = *str2++);return s;
}int main() 
{char str[20] = "abcdefg";char* str2 = "hijklmn";char* ret = my_strcat(str,str2);printf("%s\n", ret);return 0;
}

3. strcmp函数的使用和模拟实现

函数介绍:

int strcmp (const char * str1, const char * str2);
◦ 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
◦ 第⼀个字符串等于第⼆个字符串,则返回0
◦ 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
◦ 那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩

strcmp函数的模拟实现

int my_strcmp(const char *p1,const char *p2)
{assert(p1 != NULL);assert(p2 != NULL);while (*p1 == *p2){p1++;p2++;if (*p1 == '\0')return 0;}if (*p1 > *p2)return 1;else return -1;
}int main()
{int ret = 0;char* p1 = "abcdefg";char* p2 = "abcdq";ret = my_strcmp(p1, p2);printf("%d\n", ret);return 0;
}

长度受限制的字符串操作函数

1. strncpy函数的使用

函数介绍:

char * strncpy ( char * destination, const char * source, size_t num );• 拷⻉num个字符从源字符串到⽬标空间。
• 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。
//strncpy :拷贝num个字符从源字符串拷贝到目标空间,不拷贝\0,要拷贝多少字符就拷贝多
//少字符,源字符串不够就在目标字符
//串之后追加'\0',直到num个,返回str1目标字符串的地址
int main()
{char str1[10] = { 0 };char* str2 = "1234567890";strncpy(str1, str2, 5);printf("%s\n", str1);return 0;
}

运行结果:

在这里插入图片描述

2. strncat函数的使用

函数介绍:

char * strncat ( char * destination, const char * source, size_t num );
//strncat 字符串拼接,将源字符串的前num个字符追加到目标字符串结尾, 再追加一个'\0',
//如果源字符串指向的
//字符串长度小于num的时候, 只会将字符串中到'\0'的内容追加到destination指向的字符
//串末尾,返回目标字符串str1的地址
int main()
{char str1[10] = "abcf";char str2[10] = "12345";strncat(str1, str2, 3);printf("%s\n", str1);
}

3. strncmp函数的使用

函数介绍:

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

在这里插入图片描述

其它常用字符串操作函数

1. strlen函数的使用和模拟实现

函数介绍:

size_t strlen ( const char * str );• 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包
含 '\0' )。
• 参数指向的字符串必须要以 '\0' 结束。
• 注意函数的返回值为size_t,是⽆符号的( 易错 )
• strlen的使⽤需要包含头⽂件
• 学会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;
}

代码结果:

在这里插入图片描述

strlen函数的模拟实现:

#include<stdio.h>
#include<assert.h>//模拟实现strlen 1(计数器版本)size_t my_strlen1(const char* p)
{	assert(p);int count = 0;//计数器while (*p != '\0'){p++;count++;}return count;
}//模拟实现strlen 2(函数递归版本)
size_t my_strlen2(const char* p)
{assert(p);if (*p == '\0')return 0;elsereturn 1 + my_strlen2(p + 1);
}//模拟实现strlen 3(指针-指针版本)
size_t my_strlen3(const char* p)
{assert(p);char* s = p;while(*s != '\0')s++;return s - p;
}int main() 
{char* str = "abcdefg";int ret1 = my_strlen1(str);int ret2 = my_strlen2(str); int ret3 = my_strlen3(str);printf("%d\n", ret1);printf("%d\n", ret2);printf("%d\n", ret3);return 0;
}

2. strstr函数的使用和模拟实现

函数介绍:

char * strstr ( const char * str1, const char * str2);
//函数返回str2在str1中第一次出现的位置
//字符串中的比较匹配不包含\0,以\0作为结束标志
#include <stdio.h>
#include <string.h>
int main()
{char str[] = "This is a simple string";char* pch;pch = strstr(str, "simple");strncpy(pch, "sample", 6);printf("%s\n", str);return 0;
}

strstr函数的模拟实现

char* my_strstr(const char* p1,const char* p2)
{const char* s1 = NULL;const char* s2 = NULL;const char* cur = p1;if (p2 == NULL){return p1;}while (*cur) {s1 = cur;s2 = p2;while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0'){s1++;s2++;}if (*s2 == '\0'){return cur;}cur++;}return NULL;
}int main()
{	char* p1 = "abcdefg";char* p2 = "cde";char *ret = my_strstr(p1, p2);printf("%s\n", ret);return 0;
}

3. strtok函数的使用

函数介绍:

char * strtok ( char * str, const char * sep);
//strtok 函数的使用,字符串分割
//char* strtok(char* str,const char* sep);
//sep指向了一个字符串,定义了分隔符的集合
//第一个参数指定一个字符串, 它包含了多个或者0个由sep字符串中一个或者多个分隔符分割的标记
//strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针,并且保存这个标记结束的位置
//(注:strtok函数会改变被操作的字符串,所以在使用的时候strtok函数切分的字符串一般都是临时拷贝的内容并且可被修改)
//strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,返回这个标记,并且保存结束位置
//第一个参数为NULL,函数将在同一字符串中被保存的位置开始查找下一个标记
//如果字符串中不存在更多标记,则返回NULL指针
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;
}

4. 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;
}

在vs下运行结果如下:

No error
Operation not permitted
No such file or directory
No such process
Interrupted function call
Input/output error
No such device or address
Arg list too long
Exec format error
Bad file descriptor
No child processes

实际运用举例:

int main()
{FILE* pFile;pFile = fopen("text,txt", "r");if (pFile == NULL)printf("Error opening file text.txt: %s\n", strerror(errno));return 0;
}

运行结果:

在这里插入图片描述

perror函数

函数介绍:

perror函数直接将错误信息打印出来, perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。

int main()
{FILE* pFile;pFile = fopen("text,txt", "r");if (pFile == NULL)perror("Error opening file text.txt");return 0;
}

运行结果:

在这里插入图片描述

三 . 总结

字符函数和字符串函数是编程中常用的函数,能够帮助我们处理和操作文本数据,提高程序的灵活性和效率。在实际编程中,灵活运用字符函数和字符串函数可以简化代码逻辑,提高代码的可读性和可维护性.
如果觉得此文章有用的话记得 点赞 收藏 , 如有错误 ,恳请指正 感谢各位读者 !

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

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

相关文章

RT-Thread 启动流程源码详解

RT-Thread 启动流程 一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头。RT-Thread 支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一启动入口。一般执行顺 序是:系统先从启动文件开始运行,然后进入 RT-Thread 的…

vi编辑器

目录 一、文本编辑器vi命令 1.作用&#xff1a; 2.vi和vim 二、vi编辑器的三种模式 三、输入模式 四、命令模式 五、末行模式 一、文本编辑器vi命令 1.作用&#xff1a; 创建或修改文本文件 维护Linux系统中的各种配置文件 2.vi和vim vi:类UNIX操作系统的默认文本编辑器…

标准更新丨美国发布玩具安全标准ASTM F963-23

2023年10月13日&#xff0c;美国材料试验协会 (ASTM)发布了玩具安全标准ASTM F963-23。新版标准主要修订了声响、电池可触及性、膨胀材料和弹射玩具的技术要求&#xff0c;另外&#xff0c;澄清和调整了邻苯二甲酸酯、玩具基材重金属的豁免以及溯源标签的要求&#xff0c;使其保…

基于Python的豆瓣电影、豆瓣电影评分可视化、豆瓣电影评分预测系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

从零开始写一个RTSP服务器(一)RTSP协议讲解

目录 前言一、什么是RTSP协议&#xff1f;二、RTSP协议详解2.1 RTSP数据格式2.2 RTSP请求的常用方法2.3 RTSP交互过程2.4 sdp格式 三、RTP协议3.1 RTP包格式3.2 RTP OVER TCP 四、RTCP 前言 为什么要写这个系列&#xff1f; 因为我自己在学习rtsp协议想自己从零写一个rtsp服务…

【opencv】示例-npr_demo.cpp 非真实感渲染:边缘保留平滑、细节增强、铅笔素描/彩色铅笔绘图和风格化处理...

Edge Preserve Smoothing- Using Normalized convolution Filter Edge Preserve Smoothing-Using Recursive Filter Detail Enhancement Pencil sketch/Color Pencil Drawing Stylization /* * npr_demo.cpp * * 作者: * Siddharth Kherada <siddharthkherada27[at]gmail[do…

JavaScript代码挑战

让我们回到朱莉娅和凯特关于狗的研究。这次&#xff0c;他们想把狗的年龄转换成人的年龄&#xff0c;并计算出研究中狗的平均年龄。 创建一个函数 “calcAverageHumanAge”&#xff0c;该函数接受一个狗的年龄数组&#xff08;‘age’&#xff09;&#xff0c;并按顺序执行以下…

KDTree索引(K近邻搜索,半径R内近邻搜索)——PCL

K近邻搜索&#xff08;K Nearest Neighbors&#xff09; K近邻搜索是一种基于点数量的搜索方法&#xff0c;它会找到指定点附近最接近的K个邻居点。K近邻搜索中的K值是一个参数&#xff0c;您需要指定要搜索的邻居数量。该方法适用于需要查找固定数量邻居点的情况&#xff0c;…

Redis队列与Stream

Redis队列与Stream、Redis 6多线程详解 Redis队列与StreamStream总述常用操作命令生产端消费端单消费者消费组消息消费 Redis队列几种实现的总结基于List的 LPUSHBRPOP 的实现基于Sorted-Set的实现PUB/SUB&#xff0c;订阅/发布模式基于Stream类型的实现与Java的集成消息队列问…

Django模型入门

Django模型入门 为了能够学会使用Django模型&#xff0c;本节通过构建一个实际的Django模型来帮助读者尽快入门。 3.2.1 定义模型 既然Django模型实现了ORM功能&#xff0c;那么它就是对数据库实例的描述和实现。下面&#xff0c;我们通过一个简单的实例进行讲解。 如果需…

C语言-详解内存函数

文章目录 1.memcpy使用和模拟实现1.1 memcpy函数的使用规则1.2 memcpy函数的使用1.2 模拟实现memcpy函数 2.memmove 函数的使用和模拟实现2.1 memmove 函数使用规则2.2 memmove函数的使用2.3 模拟实现memmove函数2.3.1 从后往前移2.3.2 从前往后移 2.4 算法实现2.4.1 从前往后移…

机器学习之特征选择(Feature Selection)

1 引言 特征提取和特征选择作为机器学习的重点内容&#xff0c;可以将原始数据转换为更能代表预测模型的潜在问题和特征的过程&#xff0c;可以通过挑选最相关的特征&#xff0c;提取特征和创造特征来实现。要想学习特征选择必然要了解什么是特征提取和特征创造&#xff0c;得…

算法100例(持续更新)

算法100道经典例子&#xff0c;按算法与数据结构分类 1、祖玛游戏2、找下一个更大的值3、换根树状dp4、一笔画完所有边5、树状数组&#xff0c;数字1e9映射到下标1e56、最长回文子序列7、超级洗衣机&#xff0c;正负值传递次数8、Dijkstra9、背包问题&#xff0c;01背包和完全背…

React Hooks 全解: 常用 Hooks 及使用场景详解

React Hooks 是 React 16.8 版本引入的一项重要特性,它极大地简化和优化了函数组件的开发过程。 React 中常用的 10 个 Hooks,包括 useState、useEffect、useContext、useReducer、useCallback、useMemo、useRef、useLayoutEffect、useImperativeHandle 和 useDebugValue。这些…

计算机网络——实现smtp和pop3邮件客户端

实验目的 运用各种编程语言实现基于 smtp 协议的 Email 客户端软件。 实验内容 1. 选择合适的编程语言编程实现基于 smtp 协议的 Email 客户端软件。 2. 安装 Email 服务器或选择已有的 Email 服务器&#xff0c;验证自己的 Email 客户端软件是否能进行正常的 Email 收发功…

GAMS104 现代游戏引擎 2

渲染的难点可以分为一下三部分&#xff1a;如何计算入射光线、如何考虑材质以及如何实现全局光照。 渲染的难点之一在于阴影&#xff0c;或者说是光的可见性。如何做出合适的阴影效果远比想象中要难得多&#xff0c;在实践中往往需要通过大量的技巧才能实现符合人认知的阴影效…

OpenHarmony实例应用:【常用组件和容器低代码】

介绍 本篇Codelab是基于ArkTS语言的低代码开发方式实现的一个简单实例。具体实现功能如下&#xff1a; 创建一个低代码工程。通过拖拽的方式实现任务列表和任务信息界面的界面布局。在UI编辑界面实现数据动态渲染和事件的绑定。 最终实现效果如下&#xff1a; 相关概念 低代…

Tuxera Ntfs for mac 2023中文解锁版安装、密钥下载与激活教程 Tuxera激活码 tuxera破解

Tuxera Ntfs for mac2023是Mac中专用于读写外置存储的工具&#xff0c;具有强大的磁盘管理和修复功能&#xff0c;它在Mac上完全读写NTFS格式硬盘&#xff0c;快捷的访问、编辑、存储和传输文件。能够在 Mac 上读写 Windows NTFS 文件系统。Tuxera NTFS 实现在Mac OS X系统读写…

2024妈妈杯数学建模A 题思路分析-移动通信网络中 PCI 规划问题

# 1 赛题 A 题 移动通信网络中 PCI 规划问题 物理小区识别码(PCI)规划是移动通信网络中下行链路层上&#xff0c;对各覆盖 小区编号进行合理配置&#xff0c;以避免 PCI 冲突、 PCI 混淆以及 PCI 模 3 干扰等 现象。 PCI 规划对于减少物理层的小区间互相干扰(ICI)&#xff0c;增…

mysql搭建主从

mysql搭建主从: 1:拉取mysql镜像 docker pull mysql2:创建主从对应目录 3:建立一个简易的mysql docker run -it --name mytest -e MYSQL_ROOT_PASSWORD123 -d mysql4:进入这个简易的mysql;从中获取my.cnf文件 docker exec -it mytest bash5:从容器中将my.cnf拷贝到 /3306/c…