当前位置: 首页 > 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…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...