当前位置: 首页 > news >正文

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';
http://www.cnnetsun.cn/news/3607725.html

相关文章:

  • 园区除雪设备分类
  • 嵌入式系统硬件CRC控制器:原理、模式与应用实战
  • RSA非对称加密在软件授权验证中的原理与应用:以Beyond Compare为例
  • 【单片机毕业设计推荐】 基于 STM32 的智能恒温除湿消毒柜控制系统设计与实现,基于 STM32 的物联网智能柜体环境监测与调控系统设计(013003)
  • 文献综述写不下去?通义千问智能降维技巧来了,1小时生成逻辑闭环框架,导师当场点赞
  • 从零接触FastAPI框架,今日学习day04
  • mmdetection3D与NuScenes数据集实战指南
  • 易拉罐正反面识别数据集下载,支持yolo,coco json,pasical voc xml格式的标注信息,平均正确识别率为99.5%,训练集2373张图片
  • Profinet--TIAPortal V19安装与项目实战指南
  • 智能查重工具革新:从算法原理到论文降重实战
  • Llama2架构解析与工程实践优化指南
  • verilog HDLBits刷题[Counters]“Exams/ece241 ”---Counter 1000
  • 法律AI智能体架构设计与性能调优实战
  • ping和traceroute
  • 软考全科目学习资料完全免费分享
  • Cortex-M4 FPU硬件浮点单元:原理、配置与嵌入式实时系统优化实践
  • TM4C129XNCZAD实战:PWM、QEI与ADC模块协同构建高精度电机控制系统
  • 电池电量计核心术语解析:从SOC到Qmax,构建精准电池管理知识体系
  • Agentic自主进化机制:合成数据与强化学习的实践
  • 【Springboot毕设全套源码+文档】基于springboot电脑商城系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • Windows转发Linux系统的X11(二):By MobaXterm
  • 电子合同ROI深度解析:制造业年省142万,三年累计节省410万
  • 【Rust自学】14.3. 使用pub use导出方便使用的API
  • INT4 通俗完整讲解
  • 多智能体协作系统架构设计:从理论到框架选型实战
  • Dify工作流版本迁移灾难复盘:一次升级导致服务中断47分钟,我们用这4个自动化回滚方案止损
  • 嘎嘎降AI和率零哪个更适合本科论文:2026年本科论文降AI工具实测深度对比
  • 同一户型,7种AI引擎输出对比:实测Diffusion vs LDM vs 3DGS在软装纹理还原度上的13.8%关键差距
  • 律师整理拜访客户笔录难?2026年5款录音转文字工具帮你快速成文
  • 《AI 渐进编程》之二十一:Agent 不光要交代码,还要交证据包