字符函数和字符串函数详解(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…...
HTML 字符集
为了正确显示 HTML 页面,Web 浏览器必须知道要使用哪个字符集。 从 ASCII 到 UTF-8 ASCII 是第一个字符编码标准。ASCII 定义了 128 种可以在互联网上使用的字符:数字(0-9)、英文字母(A-Z)和一些特殊字符…...
【C语言】每日刷题 —— 牛客语法篇(3)
前言 大家好,继续更新专栏c_牛客,不出意外的话每天更新十道题,难度也是从易到难,自己复习的同时也希望能帮助到大家,题目答案会根据我所学到的知识提供最优解。 🏡个人主页:悲伤的猪大肠9的博客…...
基于Vue3和element-plus实现一个完整的登录功能
先看一下最终要实现的效果:登录页面:注册页面:(1)引入element-plus组件库引入组件库的方式有好多种,在这里我就在main.js全局引入了.npm i element-plus -Smain.js中代码:import { createApp } from "vue"; //element-plus import ElementPlus from "element-pl…...
【java】Java 中泛型的实现原理
文章目录前序1. 泛型1.1 泛型方法1.2 泛型类1.3 泛型接口2. 泛型的基本原理3. 小结前序 泛型是 Java 开发中常用的技术,了解泛型的几种形式和实现泛型的基本原理,有助于写出更优质的代码。本文总结了 Java 泛型的三种形式以及泛型实现原理。 1. 泛型 …...
【C++提高编程】C++全栈体系(二十七)
C提高编程 第五章 STL- 常用算法 三、常用排序算法 算法简介: sort //对容器内元素进行排序random_shuffle //洗牌 指定范围内的元素随机调整次序merge // 容器元素合并,并存储到另一容器中reverse // 反转指定范围的元素 1. sort 功能描述&#…...
软考高级信息系统项目管理师系列之三十九:项目集管理
软考高级信息系统项目管理师系列之三十九:项目集管理 一、项目集管理内容二、项目集管理基础概述1.项目集定义2.项目集活动3.项目集管理三、项目集的管理过程四、项目集治理1.项目集治理概述2.项目集指导委员会的职责3.项目集治理功能五、项目集生命周期1.项目集生命周期三个阶…...
44-Golang中的channel
Golang中的channel为什么要使用channelchannel的介绍channel的基本使用定义/声明channel管道的遍历和关闭channel的关闭channel的遍历goroutine和channel结合应用实例1应用实例2案例注意事项为什么要使用channel 前面使用全局变量加锁同步来解决goroutine的通讯,但…...
80/20法则
80/20法则(The 80/20 Rule)又称为帕累托法则(Pareto Principle)、二八定律、帕累托定律、最省力法则、不平衡原则、犹太法则、马特莱法则等一、什么是80/20法则80/20法则(The 80/20 Rule),又称为帕累托法则…...
计算机网络高频面试题(四)
一、什么是计算机网络 是一个将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统 按分布范围,计算机网络里有局域网LAN和广域网WAN, 其中局域网的代表以太网,以及这…...
[计算机组成原理(唐朔飞 第2版)]第三章 系统总线(学习复习笔记)
3.1 总线的基本概念 计算机系统的五大部件之间的互连方式有两种 各部件之间使用单独的连线,称为分散连接将各部件连到一组公共信息传输线上,称为总线连接 总线是连接多个部件的信息传输线,是各部件共享的传输介质。 当多个部件与总线相连时&…...
c 做网站源码实例/常州百度推广代理
李宏毅机器学习笔记(LeeML-Notes) leeml-notes 机器学习 人工智慧(Artificial Intelligence)是我们想要达成的目标,希望机器可以跟人一样的聪明。机器学习(Machine Learning)是想要达成目标的手段,希望机…...
外贸网站建设和seo/二级网站怎么做
启动结果如下图,没有对应的进程: 查看myid文件,发现文件内容被更改了(本来是2,结果却变成了0): 参考zoo.cfg配置文件(机器对应的编号在这个文件里面),将myid里…...
网站网站建设设计/互联网营销有哪些方式
IDEA自定义代码模板,让开发更快更快乐IDEA中有个Live Template选项,就是用来自定义代码模板,来提高编码效率。1、创建模板,并做基本的变量配置,例如:Service() $INTER$Impl $INTER${Logger log Logger.get…...
哪个网站可以付费做淘宝推广/优化公司怎么优化网站的
说明:使用交互式DBMS工具重要的是,要理解联结不是物理实体。换句话说,它在实际的数据库表中并不存在。DBMS会根据需要建立联结,它在查询执行期间一直存在。 一、等值语法:SELECT 字段 FROM 表1,表2 WHERE 表1.字段表2.…...
建设银行网站logo/房地产销售怎么找客户
X86CPU的寻址方式大体可以分为3类:寄存器寻址,立即数寻址,内存寻址内存寻址又可分为以下几类:直接寻址,基址寻址,变址寻址,基址变址寻址寻址指的是CPU在寻找数的地址,这个数可以是源…...
vps 网站备案/如何制作自己的网站教程
基础知识在前面一篇,文件上传代码。耐心看到后面的重构,简洁多了 重构代码下载:http://download.csdn.net/detail/xiaozhegaa/9782629 (一) 开发思路:代码看起来有点乱,但是是有思路的 1:工厂…...