字符函数和字符串函数详解(1)
目录
- 前言
- strlen函数
- strlen
- sizeof
- strcpy函数
- strcat函数
- strcmp函数
- 总结
前言
最近要调整状态,写的文章质量不佳让大家失望,我现在也在反思我在做什么,我会什么,我学了什么。等我想明白的那天,我一定能跟大家顶峰相见的,也祝大家低头赶路,敬事如仪。

我也在这用基普乔格的一句话感谢大家的支持:" No human is limited.",最后回到正题 我们今天讲的是c语言缺少的一部分东西,<string.h>库里的函数,这里面的函数可大有来头,听我娓娓道来。
strlen函数
你虽然看这函数这么点单词,肯定不高级,欸,这函数还真是不得了了,这函数大有来头,听我一一分析,听完你知乎内涵呀
size_t strlen ( const char * str );
可知这代码结构式虽然这么简单,但在不管是做题,工作中,这代码的重要程度仅此于sizeof。所以我们引出第一个话题 跟sizeof的区别
strlen
strlen作为一个库函数,他作用于字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。又有人问了 啥意思,说话能解决的事情要代码干嘛,代码展示:
#include <stdio.h>
#include <string.h>
int main(){char str[100] = { 0 };size_t len;gets(str);len = strlen(str);printf("Length: %d\n", len);return 0;
}

其实根据我们也能发现 strlen是根据\0的位置找出前面字符的个数。这就是strlen中的最重要的最用,其实不管是在oj题中还是练习题,strlen能最快帮我们定位到一个数组最后的一个元素,更好去使用。
#include <stdio.h>
#include <string.h>
#include <assert.h>void reverse(char* left, char* right) //逆序字符串(整个字符串的逆序)
{assert(left != NULL && right != NULL);while (left < right){int ret = *left;*left = *right;*right = ret;left += 1;right -= 1;}
}int main()
{char arr[100] = { 0 };gets(arr);int len = strlen(arr);reverse(arr, arr + len - 1);printf("%s", arr);return 0;
}
就也是最简单最暴力的逆序排序了。
用到strlen找到最后一个元素。
最后要一下strlen函数的返回类型是size_t - 无符号整型
sizeof
首先注意的是sizeof更重要的在于他不是个函数,而是一个操作符。
sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。
其实简单来说 记录就是字符串的所占空间,可以说跟strlen打不到一边
但为什么总是于strlen弄混(本人也弄混),其实最主要的是对两个的用法含义不太理解。但是看了我这一部分你会懂了很多的
sizeof使用形式: sizeof(type)
数据类型必须用括号括住: sizeof(int)
int a=10;
int arr[]={1,2,3};
char str[]="hello";
int len_a = sizeof(a);
int len_arr = sizeof(arr);
int len_str = sizeof(str);
printf("len_a=%d,len_arr=%d,len_str=%d\n",len_a,len_arr,len_str);
计算了每个不同类型的所占空间
strcpy函数
Copies the C string pointed by source into the array pointed by destination, including theter minating null character (and stopping at that point)
我们翻译一遍就是拷贝功能,那他有啥功能让我把英文都列举出来了。
char *strcpy(char *dest, const char *src)
简单来看一下,我们会发现每个字符串都有一个‘\0’,我们进行猜想 为啥拷贝完结束了,会不会也把‘\0’拷贝进去了,我们上机模拟
int main()
{char str1[] = "Sample string";char str2[40];char str3[40];strcpy(str2, str1);strcpy(str3, "copy successful");printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);return 0;
}

其实我们也发现strcpy还是把‘\0’传过去了,所以strcpy有以下规则
- 源字符串必须以 ‘\0’ 结束。
- 会将源字符串中的 ‘\0’ 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串
我们知道以下规则 那我们去创作一个自己的strcpy函数
#include <assert.h>//返回的是目标空间的起始地址
char* my_strcpy(char* dest, const char*src)
{char* ret = dest;assert(dest && src);while (*dest++ = *src++){;}return ret;
}int main()
{char arr1[] = "hehe";char arr2[20] = { 0 };//my_strcpy(arr2, arr1);//printf("%s\n", arr2);printf("%s\n", my_strcpy(arr2, arr1));return 0;
}
通过使用欸,跟原本函数不一样,我们就知道了这可能就是strpy函数的源码了。
学到这,你其实就发现其实这些函数都是程序都是程序员模拟的。
strcat函数
这个函数可能很多人没见过,那会不多说 我放英文原意
Copies the first num characters of source to destination. If the end
of the source C string (which is signaled by a null-character) is
found before num characters have been copied, destination is padded
with zeros until a total of num characters have been written to it
原意就是 在后面字符串中往后添加后面的数组的内容
char * strcat ( char * destination, const char * source );
在这int main()
{char arr1[20] = "hello \0xxxxxxxxx";char arr2[] = "world";//追加strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}
我通过运行也发现得出结果是hello world
源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改
那如果是自己给自己追加呢,上代码
int main()
{char arr2[] = "world";//追加strcat(arr2, arr2);printf("%s\n", arr2);return 0;
}
我们会发现 这个代码一直在循环,下面也是我画的图,根据图你会发现‘\0’被原本覆盖了。

我们知道了规则,写出一串代码就变了容易很多
自作代码:
#include<assert.h>
char* my_strcat(char* dest, const char*src)
{assert(dest && src);char* ret = dest;//找目标空间中的\0while (*dest != '\0'){dest++;}//拷贝while (*dest++ = *src++){;}return ret;
}
int main()
{char arr1[20] = "bit";my_strcat(arr1, arr1);printf("%s\n", arr1);//char arr1[20] = "hello ";//char arr2[] = "world";//追加//my_strcat(arr1, arr2);//printf("%s\n", arr1);return 0;
}
这是代码的形成,通过这个代码更能分析出strcat的规则。
strcmp函数
这个函数是str+cmp组成的,欸,我们要警觉了,但我们还是要猜想是不是一个比较两个数组的函数,那我们就看下
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.
我们会发现这就是一个比较两数组的函数,我们用代码测试一下他的规则
int main()
{//char* p = "abcdef";比较2个字符串的内容的时候,不能使用==,应该使用strcmp//if ("abcdef" == "bbcdef")//这里比较的是连个字符串首字符的地址,而并不是字符串的内容//{//}char arr1[] = "abq";char arr2[] = "abq";char arr3[] = "abc";char arr4[] = "abz";int ret = strcmp(arr1, arr2);int ret1 = strcmp(arr1, arr3);int ret2 = strcmp(arr1, arr4);printf("%d\n", ret);printf("%d\n", ret1);printf("%d\n", ret2);return 0;
}

所以我们发现以下规则:
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
就是一个一个字母比较 ,如果相同则跳过,直到比较到一个ascII不相同的字符,则停下,显示屏输出返回值。
知道一下规则,我们模拟此函数
#include <stdio.h>int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2) {if (*str1 == '\0')return 0;str1++;str2++;}return *str1 - *str2;//if (*str1 > *str2)// return 1;//else// return -1;
}int main()
{char arr1[] = "abzqw";char arr2[] = "abq";/*int ret = my_strcmp(arr1, arr2);printf("%d\n", ret);*/if (strcmp(arr1, arr2) >0)printf(">\n");return 0;
}
通过一个一个指针指向的函数进行比较,使的比较更简单。这也是学习的意义呀。
总结
写文章其实对于我来说就是放松。面对严峻的考试,痛苦的会议,学校的压力。
唯有写文章可以放松自我,提升自我,让自己有更好的理解,而我是一个喜欢分享生活,享受生活的人,有生活烦恼来找我,有故事来找我,有酒,私信必回。
最后也祝所有看我的文章的人,生意顺利,没有任何烦恼,幸福走下后面的路。

用林俊杰的话作为结尾:输了你赢了世界又如何。加油各位
相关文章:
字符函数和字符串函数详解(1)
目录前言strlen函数strlensizeofstrcpy函数strcat函数strcmp函数总结前言 最近要调整状态,写的文章质量不佳让大家失望,我现在也在反思我在做什么,我会什么,我学了什么。等我想明白的那天,我一定能跟大家顶峰相见的&a…...
【数据分析:工具篇】NumPy(1)NumPy介绍
【数据分析:工具篇】NumPy(1)NumPy介绍NumPy介绍NumPy的特点数组的基本操作创建数组索引和切片数组运算NumPy介绍 NumPy(Numerical Python)是Python的一个开源的科学计算库,它主要用于处理大规模的多维数组…...
mysql时区问题
设置mysql容器时间与服务器时间一致 问题背景: 今天测试发现一个问题,时间不一致,当工单入库时,其创建时间和更新时间应该是一样的,即使不一样最多只会错几秒的时间;实际上两个时间相差的大概8小时&#…...
磨金石教育摄影技能干货分享|高邮湖上观花海
江苏高邮,说到这里所有人能想到的,就是那烟波浩渺的高邮湖。高邮在旅游方面并不出名,但是这里的自然人文景观绝对不输于其他地方。高邮不止有浩瀚的湖泊,春天的油菜花海同样壮观。春日的午后,与家人相约游玩࿰…...
mysql navicat忘记密码
mysql忘记密码是常用的事情,那么如何解决它呢?1、首先将MySQL的服务关闭,两种方法:(1)打开命令行cmd输入net stop mysql命令即可关闭MySQL服务。(2)打开任务管理器,找到服…...
Git的下载、安装、配置、使用、卸载
前言 我是跟着狂神老师学的。该博客仅用于笔记所用。 下面是老师的B站和笔记 B站:https://www.bilibili.com/video/BV1FE411P7B3?p1&vd_source9266cf72b1f398b63abe0aefe358d7d6 笔记:https://mp.weixin.qq.com/s/Bf7uVhGiu47uOELjmC5uXQ 一、准备工…...
【博客631】监控网卡与进程网络IO使用情况
监控进程的网络IO使用情况 1、vnstat 由于 vnstat 依赖于内核提供的信息,因此执行以下命令来验证内核是否提供了 vnStat 所期望的所有信息: # vnstat --testkernel This test will take about 60 seconds. Everything is ok.不带任何参数的 vnstat 将…...
【Leetcode】【简单】35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 示例 2: 输入:…...
sql面试题
mysql优化 优化准则: 建表时:合理选择字段的类型,单表字段数量 sql查询尽量单表操作,避免复杂操作,复杂的多表通过java代码实现 构建复合索引优化,索引尽量可以覆盖主要业务查询 sql避免索引失效 避免大…...
SQL 进阶刷题笔记
SQL 进阶刷题笔记 一、MySQL 进阶 这里主要是 MySQL 刷题相关笔记,方便后面温习和查阅,希望可以帮到大家!!! 题1 请计算每张SQL类别试卷发布后,当天5级以上的用户作答的人数uv和平均分avg_score࿰…...
[网鼎杯 2020 朱雀组]Think Java
SqlDict.java ,其中sql语句处存在sql注入漏洞 package .sqldict;import cn.abc.core.sqldict.Row; import cn.abc.core.sqldict.Table; import java...
AIR32F103(十) 在无系统环境和FreeRTOS环境集成LVGL
目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告AIR32F103(二) Linux环境和LibOpenCM3项目模板AIR32F103(三) Linux环境基于标准外设库的项目模板AIR32F103(四) 27倍频216MHz,CoreMark跑分测试AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码AIR32F103(六) ADC,I2S…...
SpringBoot接口 - 如何统一异常处理
SpringBoot接口如何对异常进行统一封装,并统一返回呢?以上文的参数校验为例,如何优雅的将参数校验的错误信息统一处理并封装返回呢?为什么要优雅的处理异常如果我们不统一的处理异常,经常会在controller层有大量的异常…...
如何使用Python进行数据可视化
数据可视化是一种将数据呈现为图形或图表的技术,它有助于理解和发现数据中的模式和趋势。Python是一种流行的编程语言,有很多库可以帮助我们进行数据可视化。在本文中,我们将介绍使用Python进行数据可视化的基本步骤。 第一步:导…...
vue -- 自定义指令钩子函数补充 自定义过滤器filter参数
自定义指令补充 自定义指令通过钩子函数的形式来实现自定义的功能 这里是几个常用的钩子函数以及它的方法: bind:只调用一次,指令第一次绑定到元素时调用,在这里可以进行一次性的初始化设置。 inserted:被绑定元素插…...
Qt不会操作?Qt原理不知道? | Qt详细讲解
文章目录Qt界面开发必备知识UI界面与控件类型介绍Qt设计器原理控件类型的介绍信号与槽机制处理常用控件创建与设置常见展示型控件创建与设置常见动作型控件创建与设置常见输入型控件创建与设置常见列表控件创建于设置Qt中对象树的介绍项目源码结构刨析.pro.hmain.cpp.cppQt界面…...
LeetCode-面试题 17.05. 字母与数字【前缀和,哈希表】
LeetCode-面试题 17.05. 字母与数字【前缀和,哈希表】题目描述:解题思路一:前缀和。数字为-1,字母为1。我们需要找到的子数组是前缀和之差为0的,例如s[right]-s[left]0,那么s[right]s[left],变为…...
华为OD机试题 - 叠放书籍(JavaScript)| 机考必刷
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:叠放书籍题目输入输出示例一输入输出Code解题思路版权说明华为O…...
【数据库概论】第十一章 数据库并发控制
第十一章 并发控制 在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务并行运行,这就是同时并发方式。当多个用户并发存取数据库时会产生多个事务同时存取同一事务的情况,如果…...
Nginx配置实例-反向代理案例二
实现效果:使用nginx反向代理,根据访问的路径跳转到不同端口服务 nginx监听端口为9000, 访问 http://127.0.0.1:9000/edu/ 直接跳转到127.0.0.1:8080 访问 http://127.0.0.1:9000/vod/ 直接跳转到127.0.0.1:8081 一、准备工作 1. 准备两个tom…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
