【C】字符串操作函数
初始化字符串
#include <string.h>void *memset(void *s, int c, size_t n);
返回值:s指向哪,返回的指针就指向哪
memset
函数把s
所指的内存地址开始的n
个字节都填充为c
的值。通常c
的值为0,把一块内存区清零。例如定义char buf[10];
,如果它是全局变量或静态变量,则自动初始化为0(位于.bss
段),如果它是函数的局部变量,则初值不确定,可以用memset(buf, 0, 10)
清零,由malloc
分配的内存初值也是不确定的,也可以用memset
清零。
取字符串长度
#include <string.h>size_t strlen(const char *s);
返回值:字符串的长度
strlen
函数返回s
所指的字符串的长度。该函数从s
所指的第一个字符开始找'\0'
字符,一旦找到就返回,返回的长度不包括'\0'
字符在内。例如定义char buf[] = "hello";
,则strlen(buf)
的值是5,但要注意,如果定义char buf[5] = "hello";
,则调用strlen(buf)
是危险的,会造成数组访问越界。
拷贝字符串
#include <string.h>
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);void *memcpy(void *dest, const void *src, size_t n);
void *memmove(void *dest, const void *src, size_t n);
返回值:dest指向哪,返回的指针就指向哪
strcpy
在拷贝字符串时会把结尾的'\0'
也拷到dest
中,因此保证了dest
中是以'\0'
结尾的字符串。但另外一个要注意的问题是,strcpy
只知道src
字符串的首地址,不知道长度,它会一直拷贝到'\0'
为止,所以dest
所指向的内存空间要足够大,否则有可能写越界。
strncpy
的参数n
指定最多从src
中拷贝n
个字节到dest
中,换句话说,如果拷贝到'\0'
就结束,如果拷贝到n
个字节还没有碰到'\0'
,那么也结束,调用者负责提供适当的n
值,以确保读写不会越界,比如让n
的值等于dest
所指向的内存空间的大小。
memcpy
函数从src
所指的内存地址拷贝n
个字节到dest
所指的内存地址,和strncpy
不同,memcpy
并不是遇到'\0'
就结束,而是一定会拷贝完n
个字节。这里的命名规律是,以str
开头的函数处理以'\0'
结尾的字符串,而以mem
开头的函数则不关心'\0'
字符,或者说这些函数并不把参数当字符串看待,因此参数的指针类型是void *
而非char *
。
memmove
也是从src
所指的内存地址拷贝n
个字节到dest
所指的内存地址,虽然叫move但其实也是拷贝而非移动。但是和memcpy
有一点不同,memcpy
的两个参数src
和dest
所指的内存区间如果重叠则无法保证正确拷贝,而memmove
却可以正确拷贝。假设定义了一个数组char buf[20] = "hello world\n";
,如果想把其中的字符串往后移动一个字节(变成"hhello world\n"
),调用memcpy(buf + 1, buf, 13)
是无法保证正确拷贝的。
连接字符串
#include <string.h>char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
返回值:dest指向哪,返回的指针就指向哪
strcat
把src
所指的字符串连接到dest
所指的字符串后面
比较字符串
#include <string.h>int memcmp(const void *s1, const void *s2, size_t n);
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
返回值:负值表示s1小于s2,0表示s1等于s2,正值表示s1大于s2
memcmp
从前到后逐个比较缓冲区s1
和s2
的前n
个字节(不管里面有没有'\0'
),如果s1
和s2
的前n
个字节全都一样就返回0,如果遇到不一样的字节,s1
的字节比s2
小就返回负值,s1
的字节比s2
大就返回正值。
strcmp
把s1
和s2
当字符串比较,在其中一个字符串中遇到'\0'
时结束,按照上面的比较准则,"ABC"
比"abc"
小,"ABCD"
比"ABC"
大,"123A9"
比"123B2"
小。
strncmp
的比较结束条件是:要么在其中一个字符串中遇到'\0'
结束(类似于strcmp
),要么比较完n
个字符结束(类似于memcmp
)。例如,strncmp("ABCD", "ABC", 3)
的返回值是0,strncmp("ABCD", "ABC", 4)
的返回值是正值。
搜索字符串
#include <string.h>char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
返回值:如果找到字符c,返回字符串s中指向字符c的指针,如果找不到就返回NULL
strchr
在字符串s
中从前到后查找字符c
,找到字符c
第一次出现的位置时就返回,返回值指向这个位置,如果找不到字符c
就返回NULL
。strrchr
和strchr
类似,但是从右向左找字符c
,找到字符c
第一次出现的位置就返回,函数名中间多了一个字母r可以理解为Right-to-left。
#include <string.h>char *strstr(const char *haystack, const char *needle);
返回值:如果找到子串,返回值指向子串的开头,如果找不到就返回NULL
strstr
在一个长字符串中从前到后找一个子串(Substring),找到子串第一次出现的位置就返回,返回值指向子串的开头,如果找不到就返回NULL。这两个参数名很形象,在干草堆haystack
中找一根针needle
,按中文的说法叫大海捞针,显然haystack
是长字符串,needle
是要找的子串。
分割字符串
#include <string.h>char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
返回值:返回指向下一个Token的指针,如果没有下一个Token了就返回NULL
参数str
是待分割的字符串,delim
是分隔符,可以指定一个或多个分隔符,strtok
遇到其中任何一个分隔符就会分割字符串。
第一次调用要把字符串首地址传给strtok
的第一个参数,以后每次调用第一个参数只要传NULL
就可以了,strtok
函数自己会记住上次处理到字符串的什么位置(显然这是通过strtok
函数中的一个静态指针变量记住的)。
strtok_r
函数则不存在这个问题,它的内部没有静态变量,调用者需要自己分配一个指针变量来维护字符串中的当前处理位置,每次调用时把这个指针变量的地址传给strtok_r
的第三个参数,告诉strtok_r
从哪里开始处理,strtok_r
返回时再把新的处理位置写回到这个指针变量中(这是一个Value-result参数)。
char msg[80] = "0xb9:0x17//xxxx"; //分割 : //char *next, *sub_next;char *token, *sub_token;for (char *str1 = msg;; str1 = next){token = strtok_r(str1, "//", &next);printf("token=%s next=%s\n", token, next);if (next == NULL)break;if (0 == strlen(next))break;for (char *str2 = token;; str2 = sub_next){sub_token = strtok_r(str2, ":", &sub_next);printf("sub_token=%s sub_next=%s\n", sub_token, sub_next);if (sub_next == NULL)break;if (0 == strlen(sub_next))break;}}
相关文章:
【C】字符串操作函数
初始化字符串 #include <string.h>void *memset(void *s, int c, size_t n); 返回值:s指向哪,返回的指针就指向哪memset函数把s所指的内存地址开始的n个字节都填充为c的值。通常c的值为0,把一块内存区清零。例如定义char buf[10];&…...
【python】 pytest自动化测试框架--selenium,requests,appium自动化工具
一、pytest简介 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高 二、 pytest 单元测试框架 1、pytest 特点 pytest是python当中的一个单元框架,比unittest更灵…...

Spring boot 实战指南(三):配置事务,整合Elasticsearch、swagger、redis、rabbitMQ
文章目录一、配置事务依赖使用注解二、Elasticsearch创建项目配置maven完善依赖es连接配置实体映射repositoryservicecontroller三、swagger依赖启动类路径匹配配置配置类controller注解四、redis(代码实现)依赖yml配置配置类封装redisTamplate五、rabbi…...

九、Bean的循环依赖问题
1 什么是Bean的循环依赖 A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你,你也依赖我。 比如:丈夫类Husband,妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 2 singleton下的set注入产生的循环依赖 丈夫类 pac…...
macOS关闭SIP后,仍无法修改/usr文件夹下文件
发现问题 MacOS 升级到Big Sur后,删除多余的python3文件,发现写不到磁盘,会报OSError: [Errno 30] Read-only file system的错误。经过了解,在Mac OS10.11 之后,苹果公司为了提高系统环境安全,引入了一个内…...

【编程基础之Python】8、Python复合数据类型
【编程基础之Python】8、Python复合数据类型Python复合数据类型列表(List)创建列表访问元素内置方法列表操作元组(Tuple)创建元组访问元素集合(Set)创建集合基本操作其他操作字典(Dictionary&am…...

自动驾驶决策规划-控制方向学习资料总结(附相关资料的链接)
项目仓库 欢迎访问我的Github主页 项目名称说明chhCpp学习C仓库chhRobotics学习自动驾驶、控制理论相关仓库(python实现)chhRobotics_CPP学习自动驾驶、控制理论相关仓库(c实现)chhML 、chh-MachineLearning学习机器学习仓库chhRL学习强化学习仓库chhTricks存放一些有意思的t…...
网络安全岗位介绍——售前工程师
一、工作内容 1、独立完成并配合销售人员引导客户完成方案设计、产品选型、配置报价和能为客户提供安全咨询与方案优化等服务; 2、作为售前工程师,跟踪整个项目的进展,和销售进行配合,协调公司各种资源完成项目中标; 3、编写投标文件的技术…...

nodejs安装和卸载超详细步骤
安装程序①下载完成后,双击安装包,开始安装,使用默认配置安装一直点next即可,安装路径默认在C:\Program Files下,也可以自定义修改②安装路径默认在C:\Program Files下面,也能够自定义修改,而后…...

【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点
目录 一.【Leetcode203】移除链表元素 1.链接 2.题目再现 A.双指针法 B.类尾删法 C.哨兵位 二.【Leetcode876】链表的中间节点 1.链接:链表的中间节点 2.题目再现 3.解法:快慢指针 三.链表中倒数第k个节点 1.链接:链表中倒数第k个…...

快速上手配置firewalld
firewalld使用firewall-cmd命令配置策略。 查看当前firewalld当前服务运行状态 firewall-cmd --state firewalld防火墙状态还用使用如下命令查看状态 systemctl status firewalld 查看所有打开运行的端口 firewall-cmd --zonepublic --list-ports 查看区域信息情况 firewall…...
treap使用mt19937会导致问题原因分析
Treap 是一种使用随机数生成器来维护树形结构的数据结构,而 mt19937 是一种常用的伪随机数生成器。虽然 mt19937 可以生成高质量的随机数序列,但是在 Treap 中使用它可能会导致一些问题。 mt19937 返回的是一个 unsigned int 其中一个问题是࿰…...
tmux和vim
tmux 作用 分屏 允许断开Terminal连接后继续运行进程 结构 一个tmux可以开一堆session tmux: session 1, session 2, session 3 … Session: window 1, window 2, window 3… Window: pane 1, pane 2, pane 3… pane是最小单位,用shell语言编程 操作 输入…...
2023年全国最新保安员精选真题及答案12
百分百题库提供保安员考试试题、保安职业资格考试预测题、保安员考试真题、保安职业资格证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 121.《保安员证》是经由设区的()单位进行发放。 A:市级人民政…...

Hbase的基本概念与架构
一、Hbase的概念 HBase是Hadoop的生态系统,是建立在Hadoop文件系统(HDFS)之上的分布式、面向列的数据库,通过利用Hadoop的文件系统提供容错能力。如果你需要进行实时读写或者随机访问大规模的数据集的时候,请考虑使用H…...

颠覆你的认知,业务同事都能开发软件,我简直无地自容……
经常看到网络鼓吹业务人员也能搭建应用,本是嗤之以鼻、半信半疑,但当这件事真实发生在自己身上时,竟觉得此言不虚? 一、背景 最近公司为了集成系统、提升扩展能力,引进了低代码平台JNPF,说个题外话&#…...

01 | n2n虚拟局域网
1 n2n简介 为了满足两个不同局域网的机器进行通信,让不同网段的机器能够进行P2P( 点对点 peer-to-peer ) 通信。2 n2n源码 https://github.com/ntop/n2n.git3 n2n名词 3.1 SuperNode 超级节点 SuperNode 相当与注册中心, 它会记录边缘节点的连接信息,…...

MFC界面控件BCGControlBar v33.4 - 支持Win 11 Mica material主题
BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。BCGControlBar专业版和BCGSuite for MFC v33.4已正式发布了,该版本包含了对Windows 11 Mica materia…...

手把手教你用js实现手机通讯录功能(附源码)
js实现手机通讯录效果图需求需求一:锚点通过#id配合a标签使用css中scroll-behavior属性的使用需求二需求三获取汉字拼音的首字母方法1:使用插件,这里推荐pinyin-pro方法2:使用unicode去重数组中冗余的对象法一:用Map去…...

【C/C++】逗号表达式、算术运算符优先级
一、逗号表达式 1、如下图中代码,为变量d赋值,d的值为逗号表达式中的哪一个呢? 运行结果:d的值为6 2、再举个例子 运行结果:d的结果还是6 3、再举个例子 运行结果 以上面三种不同的逗号表达式为例,…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...

表单设计器拖拽对象时添加属性
背景:因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...