尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

C语言-字符函数和字符串函数
📅 发布时间:2026/7/23 20:09:59

目录

一,字符分类函数

二,字符转换函数

三,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';

相关新闻

  • TI微控制器RTI模块深度解析:从定时器原理到DMA触发与窗口看门狗实战
  • 利用Pyecharts绘制堆叠柱状图
  • 【AI自动发邮件实战指南】:零代码+3步部署,2024企业级邮件自动化落地手册

最新新闻

  • 基于C2000 CLA协处理器的三相异步电机无感FOC控制实战指南
  • 抖掌柜:抖音小店一件代发密文下单,规避隐私违规风险 - 电商分享
  • 百达翡丽香港2026年7月最新售后公告:门店地址、客服电话大汇总 - 百达翡丽服务中心
  • TI Jacinto平台实现YUV422输出的硬件旁路与TDM配置方案
  • 3个关键指标,帮你选出专业的种子包装袋厂家
  • 2026年法国名义雇主EOR服务排行:权威精选10大优质选项

日新闻

  • 亨得利盐城维修点在哪里?手表维修保养地址指南**公示(2026年7月最新) - 亨得利官方
  • 提升.NET API安全性:Boxed.AspNetCore.Swagger认证授权最佳实践
  • 帝舵佛山**网点地址更新:2026年7月售后热线电话与服务客户指南 - 帝舵中国官方服务中心

周新闻

  • SaaS软件行业GEO实践:AI搜索时代的品牌可见性与获客新路径
  • 什么是PCTFE?医药高端包装的“防潮王牌“材料
  • 【JVM调优实战】16-可视化利器-JConsole-VisualVM-JMC

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号