字符函数与字符串函数
前言
本次博客可以说内容最为多的一次博客,讲解同样很细致大家好好看看
1字符函数
在讲解字符函数时,大家得了解什么是字符吧
普通字符'a' ' b' 'c' '1' ' @' 转义字符' \n ' 换行‘ \t’ 水平制表符'\r'回车
大家了解即可
在C语言中字符也可以有分类
所以我们先来看看字符分类函数
1.1字符分类函数

大家看以上函数的参数返回值以及它的功能几乎一致
我们这里以这个函数为例
int isdigit ( int c );
isdigital 是能够判断参数部分的 c 是否是字符‘0’--‘9’的
代码
#include <stdio.h>
#include <ctype.h>
int main ()
{char str[]="1776ad";int size=sizeof(str)/sizeof(str[0]);while(size){if(isdigit(str[0]))printf("该字符为数字字符%c\n",str[0]);size--;}return 0;
}
该代码能够把一个字符串中的数字字符找到
看看返回值
A value different from zero (i.e., true) if indeed c is a decimal digit. Zero (i.e., false) otherwise.
如果c确实是十进制数字,则为与零不同的值(即true)。否则为零(即false)
再举一个例子
int islower ( int c );
看代码
#include <stdio.h>
#include <ctype.h>
int main ()
{int i = 0;char str[] = "Test String.\n";char c;while (str[i]){c = str[i];if (islower(c)) c -= 32;putchar(c);i++;}return 0;
}
该代码的作用是将字符串中的⼩写字⺟转⼤写,其他字符不变
当然咱么是个细节的人,看看返回值
value different from zero (i.e., true) if indeed c is a lowercase alphabetic letter. Zero (i.e., false) otherwise.
如果c确实是小写字母,则值与零不同(即true)。否则为零(即false)
上面的每一个函数的表达式几乎一样,这里不再赘述,注意还是要看看返回值的含义
而且,发现了没有参数是int但是功能却是判断字符串
主要是中间其实发生了类型转换,本身int类型是大于char类型的
1.2字符转换函数
我们在这里讲解两个
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c );//将参数传进去的⼩写字⺟转⼤写
值得注意的是,他是完全可以有我们自主实现的
那么,我们可以模拟实现该函数
当然我们上一个代码其实就是它的模拟实现
所以,我们只是举一个例子就好
#include<ctype.h>
#include<stdio.h>
int main()
{
char a[]="jdkalkdkjakldkj\n";
int i=0;
while(a[i])
{
toupper(a[i]);
puchar(a[i])
i++;
}
return 0;
}
这个代码就是把小写字母变为大写字母
2字符串函数
2.1 strlen 的使⽤和模拟实现
定义
size_t strlen ( const char * str );
作用计算字符串的长度
字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数 不包 含 '\0'
参数指向的字符串必须要以 '\0' 结束。
注意函数的返回值为 size_t,是⽆符号的( 易错 )
strlen的使⽤需要包含头⽂件
1strlen的使用
看代码
#include<string.h>
#include<stdio.h>
int main()
{char a[]=“jdlkalkdjkllkakldjkl”;
strlen(a);
return 0;
}
其实这个代码就是计算了字符串的长度
2模拟实现
分析 首先strlen函数得要接收一个地址类型是char *
返回一个无符号的数代表该字符串的长度
代码1实现
size_t My_strlen(const char* dest)
{assert(dest);int count = 0;while (*dest++)//当* dest为\0时 它的ASCLL码值为0{count++;}return count;
}
int main()
{char a[] = "jkaldkljda";printf("%zd\n", My_strlen(a));printf("%zd\n", strlen(a));return 0;
}
看结果

代码2实现
size_t My_strlen(const char* dest)
{assert(dest);char* p1 = (char *)dest;while (*dest++);//当* dest为\0时 它的ASCLL码值为0return dest-p1-1;
}
int main()
{char a[] = "jkaldkljdadakjkjlaksc";printf("%zd\n", My_strlen(a));printf("%zd\n", strlen(a));return 0;
}
其实就是把最后结果变为 指针-指针
但是由于*dest为‘\n’时有后置加加所以要多减去一个1
结果是一样的
2.2strcpy 的使⽤和模拟实现
• Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
• 源字符串必须以 '\0' 结束
• 会将源字符串中的 '\0' 拷⻉到⽬标空间
• ⽬标空间必须⾜够⼤,以确保能存放源字符串
• ⽬标空间必须可修改
上面同样是注意事项
1strcpy的使用
int main()
{char a[10] = "djklak";char b[20] = { 0 };strcpy(b, a);printf("%s", b);return 0;
}
2strcpy的模拟实现
char *strcpy( char *strDestination, const char *strSource );
返回值为目的地址
看代码
char *My_strcpy(char *dest,const char *src)
{assert(dest && src);char* p1 = dest;while (*dest++ = *src++);return p1;
}
看结果

3.3.strcat 的使⽤和模拟实现
• Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.
源字符串必须以 '\0' 结束 ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
⽬标空间必须可修改。
1strcat的使用
看代码
int main()
{char a[20] = "hello";char b[10] = " world";strcat(a, b);printf("%s\n", a);return 0;
}
2strcat的模拟实现
char *strcat( char *strDestination, const char *strSource );
char* My_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest && src);while (*(++dest));while (*dest++ = *src++);return ret;
}
int main()
{char a[20] = "hello";char b[10] = " world";char c[20] = "hello";My_strcat(a, b);strcat(c, b);printf("%s\n", a);printf("%s\n", c);return 0;
}
看结果

3.4strcmp 的使⽤和模拟实现
• This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminating null-character is reached.
•标准规定:第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字 ◦ 第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩
1strcmp的使用
int main()
{char* a = "jdkajkd";char* b = "djajdascdad";int flag = strcmp(a, b);if (flag > 0)printf("第一个字符串大\n");else if (flag == 0)printf("两个一样大\n");elseprintf("第二个字符串的\n");return 0;
}
2strcmp的模拟实现
int strcmp( const char *string1, const char *string2 );
int My_strcmp(const char* string1,const char *string2)
{assert(string1 && string2);while (*string1 && *string2){if (*string1 == *string2){string1++; string2++;}elsebreak;}return *string1 - *string2;
}
int main()
{char* a = "jdkajkd";char* b = "djajdascdad";int flag1=strcmp(a, b);int flag2 = My_strcmp(a, b);if (flag1*flag2>=0)printf("模拟成功\n");if (flag1 > 0)printf("第一个字符串大\n");else if (flag1== 0)printf("两个一样大\n");elseprintf("第二个字符串大\n");return 0;
}
看结果

3.5strncat 的使⽤和模拟实现
strncat就是多了个参数,限定copy的字符串大小
将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字 符
如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾
1strncat的使用
#include <stdio.h>
#include <string.h>
int main ()
{char str1[20];char str2[20];strcpy (str1,"To be ");strcpy (str2,"or not to be");strncat (str1, str2, 6);printf("%s\n", str1);return 0;
}
2strncat的模拟实现
char * strncat ( char * destination, const char * source, size_t num );
char *My_strncat(char *dest,const char *src,size_t n)
{char* ret = dest;assert(dest && src);while (*(++dest));while (n--&&*src)*dest++ = *src++;*dest = '\0';return ret;
}
int main()
{char str1[20];char str2[20];char str3[20];strcpy(str1, "To be ");strcpy(str2, "or not to be");strcpy(str3, "To be ");My_strncat(str1, str2, 6);strncat(str3, str2, 6);printf("%s\n", str1);printf("%s\n", str3);return 0;
}
看结果

3.6strncmp的使⽤和模拟实现
⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.
1strncmp的使用
#include <stdio.h>
#include <string.h>
int main ()
{char *p1="abcde";char *p2="abcfe";int a=strncmp(p1,p2,3);
if(a>0)
printf("第一个字符串在前3个字符中更大\n");
else if(a=0)
printf("两个字符串在前3个字符中一样大\n");
else
printf("第二个字符串在前3个字符中更大\n");return 0;
}
2strncmp模拟实现
int My_strncmp(const char* str1, const char* str2,size_t n)
{assert(str1 && str2);while (n--&& *str1 && *str2){if (*str1 == *str2){str1++; str2++;}}return *str1 - *str2;
}
int main()
{char* p1 = "abcde";char* p2 = "abcfe";int a = strncmp(p1, p2, 3);int b = My_strncmp(p1, p2, 3);if (a * b >= 0)printf("模拟成功\n");if (a > 0)printf("第一个字符串在前3个字符中更大\n");else if (a==0)printf("两个字符串在前3个字符中一样大\n");elseprintf("第二个字符串在前3个字符中更大\n");return 0;
}
看结果

3.7strstr 的使⽤和模拟实现
1strstr的使用
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;
}
2strstr模拟实现
int main()
{char *p=strstr("abcdefg","cd");printf("%s", p);return 0;
}
//2模拟实现一下
char* My_strstr(const char* p1, const char* p2)
{const char* cur=p1;const char* p3=p2;while (*cur){cur = p1;p3 = p2;while ((*p3&&*cur)&&*cur++==*p3++)if (!*p3)return (char*)p1;if (*cur)p1++;elsereturn NULL;}return NULL;
}
看结果

总结
这几个字符串函数的模拟实现花了不少时间才手打完
ok祝大家开心
相关文章:
字符函数与字符串函数
前言 本次博客可以说内容最为多的一次博客,讲解同样很细致大家好好看看 1字符函数 在讲解字符函数时,大家得了解什么是字符吧 普通字符a b c 1 转义字符 \n 换行‘ \t’ 水平制表符\r回车 大家了解即可 在C语言中字符也可以有分类 所以我们先来看看…...
Kubernetes 项目整体布局 el-container
整体布局整体布局 你可能会去敲不同的项目,有很多种平台。那么其实都是可以复用的。唯一不同的就是main里面的内容是不同的,边框架子都是相同的。其实框架是不怎么变化的,变化的是main里面。 src/layout/Layout.vue 这里需要新增一个页面Lay…...
AI赋能写作:AI大模型高效写作一本通
❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。2022年度博客之星评选TOP 10🏆,Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作…...
unraid docker.img扩容
unraid 弹Docker image disk utilization of 99%,容器下载/更新失败 我的版本是6.11.5,docker.img满了导致容器不能更新,遇到同样问题的可以先用docker命令清除一下仓库(当然不一定能清理出来,我已经清理过只清理出来1G多点&…...
Python 实现1~100之间的偶数求和
result0 for i in range(101):if i%20:result result i print(result) 或者 result0 for i in range(2,101,2):result result i print(result)...
Leetcode 387. First Unique Character in a String
Problem Given a string s, find the first non-repeating character in it and return its index. If it does not exist, return -1. Algorithm Use two lists: one list is used to count the letters in “s”; the other list is the position where the letter first …...
c++ 自己实现一个迭代器
具体代码 /*自定义迭代器的实现 */ #include <iostream> using namespace std; class num {int val; //具体的数字int length; //数字的位数void calculate_length(){if(val/100){ //这个数字只有1位length1;return;}int x10; //这里就是不断重复除直…...
HarmonyOS NEXT应用开发—图片压缩方案
介绍 图片压缩在应用开发中是一个非常常见的需求,特别是在处理用户上传图片时,需要上传指定大小以内的图片。目前图片压缩支持jpeg、webp、png格式。本例中以jpeg图片为例介绍如何通过packing和scale实现图片压缩到目标大小以内。 效果图预览 使用说明…...
深入理解nginx的请求限速模块[下]
目录 3. 源码分析3.1 配置指令3.1.1 limit_req_zone指令3.1.2 limit_req指令3.1.3 limit_req_dry_run指令3.1.4 limit_req_log_level指令3.1.5 limit_req_status指令3.2 模块初始化3.3 请求处理3.3.1 ngx_http_limit_req_handler3.3.1 ngx_http_limit_req_lookup3.3.2 ngx_http…...
王者归位:Kafka控制器组件解析
欢迎来到我的博客,代码的世界里,每一行都是一个故事 王者归位:Kafka控制器组件解析 前言控制器组件简介控制器组件的定义和作用:为什么控制器是分布式系统的核心? 保存了什么数据控制器的指定和切换故障转移控制器故障…...
XmlHttpRequest responseType: ‘stream‘ 图片代理服务器
它是一个存在于原生 XMLHttpRequest 对象中的属性。在 Web API 中,XMLHttpRequest 对象用于发送 HTTP 或 HTTPS 请求到服务器,并接收响应。responseType 属性就是用来指定预期从服务器返回的响应数据的类型。 默认值 responseType的默认值为json&#x…...
手写 UE4中的 TArray
#pragma once #include<iostream> #include<stdexcept> #define CHECK_INDEX_RANGE(Index) if (Index > ElementCount) throw std::out_of_range("索引超出界限")template<typename ElementType> class TArray {typedef unsigned int uint; pri…...
Flink实时写Hudi报NumberFormatException异常
Flink实时写Hudi报NumberFormatException异常 问题描述 在Flink项目中,针对Hudi表 xxxx_table 的 bucket_write 操作由于 java.lang.NumberFormatException 异常而从运行状态切换到失败状态。异常信息显示在解析字符串"ddd7a1ec"为整数时出现了问题。报…...
Dataset与DataLoader、transform
文章目录 1、Dataset2、DataLoader2.1 参数详解2.1.1 num_works2.1.2 pin_memory2.1.3 collate_fn 3、图像增强4、重写transform 1、Dataset 在 PyTorch 中,如果要创建自定义的数据集(Dataset),通常会继承 torch.utils.data.Data…...
海豚调度系列之:认识海豚调度
海豚调度系列之:认识海豚调度 一、海豚调度二、特性三、建议配置四、名次解释 一、海豚调度 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过…...
MateBook 14s 2023款 集显 触屏(HKFG-16)原厂Win11系统
HUAWEI华为MateBook14s笔记本电脑2023款原装Windows11,恢复出厂开箱状态系统下载 适用型号:HKFG-XX、HKFG-16、HKFG-32 链接:https://pan.baidu.com/s/1GBPLwucRiIup539Ms2ue0w?pwdfm41 提取码:fm41 原厂系统自带所有驱动、…...
zookeeper快速入门(合集)
zookeeper作为一个分布式协调框架,它的创建就是为了方便或者简化分布式应用的开发。除了服务注册与发现之外,它还能够提供更多的功能,但是对于入门来说,看这一篇就够了。后续会讲zookeeper的架构设计与原理,比如zookee…...
鸿蒙App开发学习 - TypeScript编程语言全面开发教程(上)
背景 根据鸿蒙官方的说明: ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。因此,在学习ArkTS语言之前&#…...
Java语言: JVM
1.1 内存管理 1.1.1 JVM内存区域 编号 名字 功能 备注 1 堆 主要用于存放新创建的对象 (所有对象都在这里分配内存) jdk1.8之后永久代被替换成为了元空间(Metaspace) 2 方法区(加、常、静、即) 被虚拟机加载的类信息(版本、字段、方法、接口…...
下拉树级带搜索功能
可以直接复制粘贴到自己的项目里,方法处把接口替换一下 <template><div><el-popoverplacement"bottom"width"200"trigger"click"><el-inputslot"reference"class"mrInput":placeholder"placehol…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
