news 2026/7/23 19:55:45

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言-字符函数和字符串函数

目录

一,字符分类函数

二,字符转换函数

三,strlen的使用和模拟实现

1,strlen使用

2,模拟实现strlen:

四,strcpy的使用和模拟实现

1,strcpy的使用

2,strcpy的模拟实现

3,strncpy的使用

五,strcat的使用和模拟实现

1,strcat的使用

2,strcat的模拟实现

3,strncat的使用

六,strcmp的使用和模拟实现

1,strcmp的使用

2,模拟实现strcmp

3,strncmp的使用

七,strstr的使用和模拟实现

1,strstr的使用

2,strstr的模拟实现

八,strtok函数的使用

九,strerror函数的使用


一,字符分类函数

字符分类函数用于确定字符的类型。必须包含头文件#include <ctype.h>

这些函数的返回值都是int类型,当条件为真时返回随机值,当条件为假时返回0。

运用例子:

二,字符转换函数

大写字母转为小写:int tolower(int c);

小写字母转为大写:int toupper(int c);

运用实例:

三,strlen的使用和模拟实现

1,strlen使用

核心功能:实现对字符串中字符个数的计算

头文件:#include <string.h>

语法:size_t strlen(const char* str)

注意:str中必须包含‘\0'

size_t为无符号的整型,再进行计算时易出错。

例:

结果为:>

strlen的返回值为size_t类型,同类型size_t加减的结果也为size_t类型,若两者转化为有符号类型的数据相减,就可以得到-3,但是两者相减后仍是size_t类型,此时要和int类型的数据进行比较,就需要通过补码来计算,得到的值是一个非常大的正数。

具体过程:3的补码加上(-6)的补码得到一个补码,这个补码以无符号类型进行输出就是以无符号类型的规则转化 ,以有符号类型输出就是以有符号类型的转化规则转化。

注意:不同类型的元素比较要先转化为相同的类型

2,模拟实现strlen:

1,计数器方法(定义变量计数,循环就+1,知道遇到’\0‘为止。

2,指针-指针方法 (结尾指针-起始指针)=元素个数

这两种方法在之前的文章中实现过,就不再赘述。

3,递归实现(不创建临时变量)

四,strcpy的使用和模拟实现

1,strcpy的使用

核心功能:实现对字符串的拷贝

头文件:#include <string.h>

语法:char*strcpy(char* str1,const char* str2 );

含义:将str2的字符拷贝到str1中。会覆盖掉str1中原本的内容。

str2必须以‘\0'结尾,因为会将str2的'\0'一同拷贝到str1当中。

str1必须可以修改并且空间必须足够大,能够容纳str2的所有字符。

返回值:返回指向str1的指针

2,strcpy的模拟实现

3,strncpy的使用和实现

strncpy相当于strcpy加一个参数,用来自定义拷贝的数目

语法:char*strncpy(char* str1,const char* str2,size_t num);

如果num大于源字符串,则补充'\0'到num个

strncpy的实现:

//strncpy的模拟实现 char* My_strncpy(char* str1, const char* str2,int n) { assert(str1 && str2);//判空 int i = 0; //提前记录防止后续修改,无法找回 char* ret = str1; for (i = 0;i < n;i++) { *str1 = *str2; //当超出时,str2为'\0' //补充'\0'到n个 if (*str2 == '\0') { while (i < n)//继续剩下的次数 { *str1 = '\0'; i++; str1++; } return ret; } str1++; str2++; } return ret; }

五,strcat的使用和模拟实现

1,strcat的使用

核心功能:实现对字符串的拼接

头文件:#include <string.h>

语法:char* strcat(char* str1,const char* str2)

str1必须有’\0'否则不知道从哪里开始追加,str2也必须有‘\0'

str1必须可以修改,并且空间足够大,能够容纳两者字符串之和。

返回值:返回指向str1的指针。

例子:

结果:输出hello world

2,strcat的模拟实现

3,strncat的使用和实现

追加指定个数的字符到目标字符串的末尾,再添加一个'\0'.

语法:语法:char* strncat(char* str1,const char* str2,size_t num)

如果num大于源字符串,只将源字符串的所有内容(包括’\0')追加到目标字符串中,不会多补充其他任何字符。(同strcat一样)。

strncat的实现:

//模拟实现strncat char* My_strncat(char* str1,const char* str2,int n) { assert(str1 && str2);//判空 char* ret = str1;//记录起始位置 while (*str1 != '\0')//找到\0 { str1++; } for (int i = 0;i < n;i++) { *str1 = *str2; //处理n>str2的字符数的情况 if (*str2 == '\0') { break; } str1++; str2++; } *str1 = '\0'; return ret; }

六,strcmp的使用和模拟实现

1,strcmp的使用

核心功能:实现两个字符串的比较(不能是字符)

头文件:#include <string.h>

语法:int strcmp(const char* str1,const char* str2);

返回值:

当第一个字符串大于第二个字符串时:返回大于0的数(VS中为1)

当第一个字符串等于第二个字符串时:返回0

当第一个字符串小于第二个字符串时:返回小于0的数(VS中为-1)

2,模拟实现strcmp

3,strncmp的使用

指定前num个字符进行比较

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

如果num大于源字符串,无影响。

七,strstr的使用和模拟实现

1,strstr的使用

核心功能:实现查找一个字符串是否为另一个字符串的子串

头文件:#include <string.h>

语法:char* strstr(const char* str1,const char* str2)

函数返回str2在str1中出现的起始地址,若在str1中找不到str2则返回NULL

如果arr2为”“则会直接打印arr1

2,strstr的模拟实现

八,strtok函数的使用

核心功能:对字符串以分隔符为准,进行分隔。

头文件:#include <string.h>

语法:char* strtok( char* str1,const char* sep )

sep为一个字符串,字符串的内容为分隔符的集合(不考虑顺序)

str1中含有多个sep中的分隔符,strtok函数会把str1中的分隔符变成'\0'

1,当strtok中的第一个字符为str1时,返回第一个字符串str1的首元素的地址。

2,当strtok中的第一个字符为NULL时,返回的是下一个'\0'后面字符串首元素的地址。

3,如果NULL中不存在更多的分隔符,就返回NULL

具体运用:

运用实例:

九,strerror函数的使用

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

头文件:#include <string.h>

语法:char* strerror(int errnum)

运用实例:

十,strcspn函数的使用

核心功能:从一个字符串的起始部分开始计算该字符串中,有多少个字符不在给定的字符集合中,当遇到在给定字符集合中的字符时,提前跳出,并返回前面不在其中的字符个数(字节数)。

头文件:#include <string.h>

语法:size_t strcspn(const char *s1 , const char *s2)

s1:进行扫描的字符串

s2: 字符集合字符串

使用实例:

替换换行符:

//定义一个字符数组 char id[20]; printf("请输入要修改的学生学号: "); //从键盘上获得字符但是最后会回车 /n fgets(id, sizeof(id), stdin); //通过strcspn函数找到最后一个字符的下标并进行更改 id[strcspn(id, "\n")] = '\0';
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 19:54:32

园区除雪设备分类

文章目录前言除雪设备分类除雪机抛雪机雪铲破冰机总结前言 最近在做园区无人除雪车&#xff0c;顺便把一些相关知识信息整理一下。 除雪设备分类 除雪机 一般就是滚刷式除雪机。 工作时将积雪扫到道路一边&#xff0c;适合于清理较薄的积雪&#xff0c;不适合较厚积雪。 清…

作者头像 李华
网站建设 2026/7/23 19:54:30

嵌入式系统硬件CRC控制器:原理、模式与应用实战

1. CRC控制器&#xff1a;嵌入式系统中的数据卫士 在嵌入式系统开发&#xff0c;尤其是汽车电子、工业控制这类对数据可靠性要求极高的领域&#xff0c;工程师们经常面临一个核心挑战&#xff1a;如何高效、可靠地验证存储在Flash、RAM等非易失性或易失性存储器中数据的完整性。…

作者头像 李华
网站建设 2026/7/23 19:51:37

RSA非对称加密在软件授权验证中的原理与应用:以Beyond Compare为例

1. 项目概述&#xff1a;一个逆向工程视角下的授权机制探索最近在技术社区里&#xff0c;Beyond Compare 5的授权问题又被频繁提起&#xff0c;从“密钥被吊销”到“30天评估期已结束”&#xff0c;这些提示背后&#xff0c;其实是一套基于RSA非对称加密的软件授权验证体系在运…

作者头像 李华
网站建设 2026/7/23 19:49:52

【单片机毕业设计推荐】 基于 STM32 的智能恒温除湿消毒柜控制系统设计与实现,基于 STM32 的物联网智能柜体环境监测与调控系统设计(013003)

文章目录20 个相关毕业设计备选题目项目研究背景摘要总体方案核心功能一、基础感知功能二、本地模式控制核心功能三、远程蓝牙通信功能技术路线项目演示关于我们项目案例源码获取博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6…

作者头像 李华
网站建设 2026/7/23 19:48:05

从零接触FastAPI框架,今日学习day04

一、前期回顾昨天我们了解了什么是ORM&#xff0c;以及使用ORM的优势&#xff0c;以及如何在Fast API中集成数据库二、今日学习模型设计&#xff1a;如何使用 Tortoise ORM 定义数据表结构数据库迁移&#xff1a;使用 Aerich 工具管理数据库版本接口开发&#xff1a;实现一个基…

作者头像 李华