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

字符函数和字符串函数详解(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有以下规则

  1. 源字符串必须以 ‘\0’ 结束。
  2. 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  3. 目标空间必须足够大,以确保能存放源字符串

我们知道以下规则 那我们去创作一个自己的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函数总结前言 最近要调整状态&#xff0c;写的文章质量不佳让大家失望&#xff0c;我现在也在反思我在做什么&#xff0c;我会什么&#xff0c;我学了什么。等我想明白的那天&#xff0c;我一定能跟大家顶峰相见的&a…...

【数据分析:工具篇】NumPy(1)NumPy介绍

【数据分析&#xff1a;工具篇】NumPy&#xff08;1&#xff09;NumPy介绍NumPy介绍NumPy的特点数组的基本操作创建数组索引和切片数组运算NumPy介绍 NumPy&#xff08;Numerical Python&#xff09;是Python的一个开源的科学计算库&#xff0c;它主要用于处理大规模的多维数组…...

mysql时区问题

设置mysql容器时间与服务器时间一致 问题背景&#xff1a; 今天测试发现一个问题&#xff0c;时间不一致&#xff0c;当工单入库时&#xff0c;其创建时间和更新时间应该是一样的&#xff0c;即使不一样最多只会错几秒的时间&#xff1b;实际上两个时间相差的大概8小时&#…...

磨金石教育摄影技能干货分享|高邮湖上观花海

江苏高邮&#xff0c;说到这里所有人能想到的&#xff0c;就是那烟波浩渺的高邮湖。高邮在旅游方面并不出名&#xff0c;但是这里的自然人文景观绝对不输于其他地方。高邮不止有浩瀚的湖泊&#xff0c;春天的油菜花海同样壮观。春日的午后&#xff0c;与家人相约游玩&#xff0…...

mysql navicat忘记密码

mysql忘记密码是常用的事情&#xff0c;那么如何解决它呢&#xff1f;1、首先将MySQL的服务关闭&#xff0c;两种方法&#xff1a;&#xff08;1&#xff09;打开命令行cmd输入net stop mysql命令即可关闭MySQL服务。&#xff08;2&#xff09;打开任务管理器&#xff0c;找到服…...

Git的下载、安装、配置、使用、卸载

前言 我是跟着狂神老师学的。该博客仅用于笔记所用。 下面是老师的B站和笔记 B站&#xff1a;https://www.bilibili.com/video/BV1FE411P7B3?p1&vd_source9266cf72b1f398b63abe0aefe358d7d6 笔记&#xff1a;https://mp.weixin.qq.com/s/Bf7uVhGiu47uOELjmC5uXQ 一、准备工…...

【博客631】监控网卡与进程网络IO使用情况

监控进程的网络IO使用情况 1、vnstat 由于 vnstat 依赖于内核提供的信息&#xff0c;因此执行以下命令来验证内核是否提供了 vnStat 所期望的所有信息&#xff1a; # vnstat --testkernel This test will take about 60 seconds. Everything is ok.不带任何参数的 vnstat 将…...

【Leetcode】【简单】35. 搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 示例 2: 输入:…...

sql面试题

mysql优化 优化准则&#xff1a; 建表时&#xff1a;合理选择字段的类型&#xff0c;单表字段数量 sql查询尽量单表操作&#xff0c;避免复杂操作&#xff0c;复杂的多表通过java代码实现 构建复合索引优化&#xff0c;索引尽量可以覆盖主要业务查询 sql避免索引失效 避免大…...

SQL 进阶刷题笔记

SQL 进阶刷题笔记 一、MySQL 进阶 这里主要是 MySQL 刷题相关笔记&#xff0c;方便后面温习和查阅&#xff0c;希望可以帮到大家&#xff01;&#xff01;&#xff01; 题1 请计算每张SQL类别试卷发布后&#xff0c;当天5级以上的用户作答的人数uv和平均分avg_score&#xff0…...

[网鼎杯 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接口如何对异常进行统一封装&#xff0c;并统一返回呢&#xff1f;以上文的参数校验为例&#xff0c;如何优雅的将参数校验的错误信息统一处理并封装返回呢&#xff1f;为什么要优雅的处理异常如果我们不统一的处理异常&#xff0c;经常会在controller层有大量的异常…...

如何使用Python进行数据可视化

数据可视化是一种将数据呈现为图形或图表的技术&#xff0c;它有助于理解和发现数据中的模式和趋势。Python是一种流行的编程语言&#xff0c;有很多库可以帮助我们进行数据可视化。在本文中&#xff0c;我们将介绍使用Python进行数据可视化的基本步骤。 第一步&#xff1a;导…...

vue -- 自定义指令钩子函数补充 自定义过滤器filter参数

自定义指令补充 自定义指令通过钩子函数的形式来实现自定义的功能 这里是几个常用的钩子函数以及它的方法&#xff1a; bind&#xff1a;只调用一次&#xff0c;指令第一次绑定到元素时调用&#xff0c;在这里可以进行一次性的初始化设置。 inserted&#xff1a;被绑定元素插…...

Qt不会操作?Qt原理不知道? | Qt详细讲解

文章目录Qt界面开发必备知识UI界面与控件类型介绍Qt设计器原理控件类型的介绍信号与槽机制处理常用控件创建与设置常见展示型控件创建与设置常见动作型控件创建与设置常见输入型控件创建与设置常见列表控件创建于设置Qt中对象树的介绍项目源码结构刨析.pro.hmain.cpp.cppQt界面…...

LeetCode-面试题 17.05. 字母与数字【前缀和,哈希表】

LeetCode-面试题 17.05. 字母与数字【前缀和&#xff0c;哈希表】题目描述&#xff1a;解题思路一&#xff1a;前缀和。数字为-1&#xff0c;字母为1。我们需要找到的子数组是前缀和之差为0的&#xff0c;例如s[right]-s[left]0&#xff0c;那么s[right]s[left]&#xff0c;变为…...

华为OD机试题 - 叠放书籍(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:叠放书籍题目输入输出示例一输入输出Code解题思路版权说明华为O…...

【数据库概论】第十一章 数据库并发控制

第十一章 并发控制 在多处理机系统中&#xff0c;每个处理机可以运行一个事务&#xff0c;多个处理机可以同时运行多个事务&#xff0c;实现多个事务并行运行&#xff0c;这就是同时并发方式。当多个用户并发存取数据库时会产生多个事务同时存取同一事务的情况&#xff0c;如果…...

Nginx配置实例-反向代理案例二

实现效果&#xff1a;使用nginx反向代理&#xff0c;根据访问的路径跳转到不同端口服务 nginx监听端口为9000&#xff0c; 访问 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…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...