C语言标准库介绍:<string.h>
在C语言中,<string.h>头文件是标准库中的一个重要部分,它定义了一系列操作字符串和字符数组的函数。本文将详细介绍<string.h>头文件中包含的22个函数,并提供每个函数的完整示例代码。
简介
<string.h>头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。在使用这些函数之前,我们首先来了解一下相关的库变量和宏。
库变量
<string.h>头文件中定义的变量类型如下:
- size_t: 无符号整数类型,通常用于表示内存块的大小。它是
sizeof关键字的结果。
库宏
<string.h>头文件中定义的宏如下:
- NULL: 表示空指针常量的值。
接下来,我们将逐个介绍这22个函数,并给出每个函数的示例代码。
库函数
1. void *memchr(const void *str, int c, size_t n)
在字符串的前 n 个字节中搜索第一次出现字符 c 的位置。
#include <stdio.h>
#include <string.h>int main() {const char str[] = "Hello, world!";const char ch = 'o';const size_t n = strlen(str);const char *result = memchr(str, ch, n);if (result != NULL) {printf("'%c' found at position: %ld\n", ch, result - str);} else {printf("'%c' not found in the string.\n", ch);}return 0;
}
2. int memcmp(const void *str1, const void *str2, size_t n)
比较两个内存区域的前 n 个字节。
#include <stdio.h>
#include <string.h>int main() {const char str1[] = "abc";const char str2[] = "abd";const size_t n = 2;int result = memcmp(str1, str2, n);if (result < 0) {printf("str1 is less than str2\n");} else if (result > 0) {printf("str1 is greater than str2\n");} else {printf("str1 is equal to str2\n");}return 0;
}
3. void *memcpy(void *dest, const void *src, size_t n)
从源地址复制 n 个字节到目标地址。
#include <stdio.h>
#include <string.h>int main() {char src[] = "Hello, world!";char dest[20];memcpy(dest, src, strlen(src) + 1);printf("Copied string: %s\n", dest);return 0;
}
4. void *memmove(void *dest, const void *src, size_t n)
从源地址复制 n 个字节到目标地址,处理重叠的情况。
#include <stdio.h>
#include <string.h>int main() {char str[] = "memmove can be very useful......";memmove(str + 20, str + 15, 11);printf("%s\n", str);return 0;
}
5. void *memset(void *str, int c, size_t n)
将字符 c 复制到字符串的前 n 个字符。
#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello, world!";memset(str + 7, '*', 5);printf("%s\n", str);return 0;
}
6. char *strcat(char *dest, const char *src)
将 src 追加到 dest 的末尾。
#include <stdio.h>
#include <string.h>int main() {char dest[20] = "Hello, ";const char src[] = "world!";strcat(dest, src);printf("%s\n", dest);return 0;
}
7. char *strncat(char *dest, const char *src, size_t n)
将 src 的最多 n 个字符追加到 dest 的末尾。
#include <stdio.h>
#include <string.h>int main() {char dest[20] = "Hello, ";const char src[] = "world!";strncat(dest, src, 3);printf("%s\n", dest);return 0;
}
8. char *strchr(const char *str, int c)
在字符串中搜索第一次出现字符 c 的位置。
#include <stdio.h>
#include <string.h>int main() {const char str[] = "This is a sample string";const char ch = 's';const char *result = strchr(str, ch);if (result != NULL) {printf("'%c' found at position: %ld\n", ch, result - str);} else {printf("'%c' not found in the string.\n", ch);}return 0;
}
9. int strcmp(const char *str1, const char *str2)
比较两个字符串。
#include <stdio.h>
#include <string.h>int main() {const char str1[] = "abc";const char str2[] = "abcd";int result = strcmp(str1, str2);if (result < 0) {printf("str1 is less than str2\n");} else if (result > 0) {printf("str1 is greater than str2\n");} else {printf("str1 is equal to str2\n");}return 0;
}
10. int strncmp(const char *str1, const char *str2, size_t n)
比较两个字符串的前 n 个字符。
#include <stdio.h>
#include <string.h>int main() {const char str1[] = "abc";const char str2[] = "abcd";int result = strncmp(str1, str2, 3);if (result < 0) {printf("str1 is less than str2\n");} else if (result > 0) {printf("str1 is greater than str2\n");} else {printf("str1 is equal to str2\n");}return 0;
}
11. int strcoll(const char *str1, const char *str2)
根据当前区域设置比较两个字符串。
#include <stdio.h>
#include <string.h>
#include <locale.h>int main() {setlocale(LC_COLLATE, "en_US.utf8");const char str1[] = "apple";const char str2[] = "banana";int result = strcoll(str1, str2);if (result < 0) {printf("str1 is less than str2\n");} else if (result > 0) {printf("str1 is greater than str2\n");} else {printf("str1 is equal to str2\n");}return 0;
}
12. char *strcpy(char *dest, const char *src)
复制一个字符串。
#include <stdio.h>
#include <string.h>int main() {char src[] = "Hello, world!";char dest[20];strcpy(dest, src);printf("Copied string: %s\n", dest);return 0;
}
13. char *strncpy(char *dest, const char *src, size_t n)
复制一个字符串的前 n 个字符。
#include <stdio.h>
#include <string.h>int main() {char src[] = "Hello, world!";char dest[20];strncpy(dest, src, 5);dest[5] = '\0'; // Null-terminate the stringprintf("Copied string: %s\n", dest);return 0;
}
14. size_t strcspn(const char *str1, const char *str2)
返回字符串 str1 开头连续不含字符串 str2 中的字符的长度。
#include <stdio.h>
#include <string.h>int main() {const char str1[] = "1234567890";const char str2[] = "aeiou";size_t len = strcspn(str1, str2);printf("Length until first vowel: %ld\n", len);return 0;
}
15. char *strerror(int errnum)
返回错误号 errnum 对应的错误消息字符串。
#include <stdio.h>
#include <string.h>
#include <errno.h>int main() {FILE *file;file = fopen("nonexistentfile.txt", "r");if (file == NULL) {perror("Error");printf("Error message: %s\n", strerror(errno));}return 0;
}
16. size_t strlen(const char *str)
返回字符串的长度,不包括空结束字符。
#include <stdio.h>
#include <string.h>int main() {const char str[] = "Hello, world!";size_t len = strlen(str);printf("Length of the string: %ld\n", len);return 0;
}
17. char *strpbrk(const char *str1, const char *str2)
返回字符串 str1 中第一个匹配字符串 str2 中字符的字符的位置。
#include <stdio.h>
#include <string.h>int main() {const char str1[] = "This is a sample string";const char str2[] = "aeiou";char *result = strpbrk(str1, str2);if (result != NULL) {printf("First vowel found at: %ld\n", result - str1);} else {printf("No vowels found in the string.\n");}return 0;
}
18. char *strrchr(const char *str, int c)
返回字符串中最后一次出现字符 c 的位置。
#include <stdio.h>
#include <string.h>int main() {const char str[] = "This is a sample string";const char ch = 's';const char *result = strrchr(str, ch);if (result != NULL) {printf("'%c' found at position: %ld\n", ch, result - str);} else {printf("'%c' not found in the string.\n", ch);}return 0;
}
19. size_t strspn(const char *str1, const char *str2)
返回字符串 str1 中第一个不在字符串 str2 中出现的字符的下标。
#include <stdio.h>
#include <string.h>int main() {const char str1[] = "abcde";const char str2[] = "aeiou";size_t len = strspn(str1, str2);printf("Length of initial segment containing vowels: %ld\n", len);return 0;
}
20. char *strstr(const char *haystack, const char *needle)
在字符串 haystack 中查找第一次出现字符串 needle 的位置。
#include <stdio.h>
#include <string.h>int main() {const char haystack[] = "This is a sample string";const char needle[] = "sample";char *result = strstr(haystack, needle);if (result != NULL) {printf("'%s' found at position: %ld\n", needle, result - haystack);} else {printf("'%s' not found in the string.\n", needle);}return 0;
}
21. char *strtok(char *str, const char *delim)
分解字符串为一组字符串,使用 delim 作为分隔符。
#include <stdio.h>
#include <string.h>int main() {char str[] = "This is a sample string";const char delim[] = " ";char *token = strtok(str, delim);while (token != NULL) {printf("%s\n", token);token = strtok(NULL, delim);}return 0;
}
22. size_t strxfrm(char *dest, const char *src, size_t n)
根据当前的区域设置转换字符串 src 的前 n 个字符,并将它们放置在字符串 dest 中。
#include <stdio.h>
#include <string.h>
#include <locale.h>int main() {setlocale(LC_COLLATE, "en_US.utf8");const char src[] = "banana";char dest[20];size_t len = strxfrm(dest, src, sizeof(dest));printf("Transformed string: %s\n", dest);return 0;
}
结论
通过本文,我们详细介绍了C语言标准库中<string.h>头文件提供的22个函数,并提供了每个函数的完整示例代码。这些函数在处理字符串和字符数组时非常有用,可以帮助开发人员轻松地进行字符串操作和处理。
相关文章:
C语言标准库介绍:<string.h>
在C语言中,<string.h>头文件是标准库中的一个重要部分,它定义了一系列操作字符串和字符数组的函数。本文将详细介绍<string.h>头文件中包含的22个函数,并提供每个函数的完整示例代码。 简介 <string.h>头文件定义了一个变…...
大语言模型LangChain本地知识库:向量数据库与文件处理技术的深度整合
文章目录 大语言模型LangChain本地知识库:向量数据库与文件处理技术的深度整合引言向量数据库在LangChain知识库中的应用文件处理技术在知识库中的角色向量数据库与文件处理技术的整合实践挑战与展望结论 大语言模型LangChain本地知识库:向量数据库与文件…...
展厅设计中都包含哪些分区与展示内容
1、欢迎区 欢迎区是展厅的入口处,通常展示企业品牌、企业标志和企业形象等内容。这个区域通常会有一个欢迎台,展示企业的宣传片、简介和最新资讯等。 2、产品展示区 产品展示区是展示企业产品的区域,展示的产品包括企业主营产品、新产品和重点…...
【k8s核心概念与专业术语】
k8s架构 1、服务的分类 服务分类按如下图根据数据服务支撑,分为无状态和有状态 无状态引用如下所示,如果一个nginx服务,删除后重新部署有可以访问,这个属于无状态,不涉及到数据存储。 有状态服务,如redis&a…...
【stm32】hal库学习笔记-UART/USART串口通信(超详细!)
【stm32】hal库学习笔记-UART/USART串口通信 hal库驱动函数 CubeMX图形化配置 导入LCD.ioc RTC设置 时钟树配置 设置LSE为RTC时钟源 USART设置 中断设置 程序编写 编写主函数 /* USER CODE BEGIN 2 */lcd_init();lcd_show_str(10, 10, 16, "Demo12_1:USART1-CH340&q…...
通俗易懂理解GhostNetV1轻量级神经网络模型
一、参考资料 原始论文:[1] PyTorch代码链接:Efficient-AI-Backbones MindSpore代码:ghostnet_d 解读模型压缩5:减少冗余特征的Ghost模块:华为Ghost网络系列解读 GhostNet论文解析:Ghost Module CVPR…...
P8630 [蓝桥杯 2015 国 B] 密文搜索
P8630 [蓝桥杯 2015 国 B] 密文搜索 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P8630 题目分析 基本上是hash的板子,但实际上对于密码串,只要判断主串中任意连续的八个位置是否存在密码串即可;那么我们…...
Electron实战之环境搭建
工欲善其事必先利其器,在进行实战开发的时候,我们最终的步骤是搞好一个舒服的开发环境,目前支持 Vue 的 Electron 工程化工具主要有 electron-vue、Vue CLI Plugin Electron Builder、electron-vite。 接下来我们将分别介绍基于 Vue CLI Plu…...
【0259】inval.h/inval.c的理解
1. inval.h/inval.c inval.h、inval.c是缓存无效消息(invalidation message)调度程序定义。 2. inval.h/inval.c特性 inval.h/inval.c的实现是一个非常微妙的东西,所以需要注意: 当一个元组被更新或删除时,我们的标准可见性规则(standard visibility rules)认为只要我…...
力扣爆刷第77天--动态规划一网打尽打家劫舍问题
力扣爆刷第77天–动态规划一网打尽打家劫舍问题 文章目录 力扣爆刷第77天--动态规划一网打尽打家劫舍问题一、198.打家劫舍二、213.打家劫舍II三、337.打家劫舍 III 一、198.打家劫舍 题目链接:https://leetcode.cn/problems/house-robber/ 思路:小偷不…...
深入理解C语言(5):程序环境和预处理详解
文章主题:程序环境和预处理详解🌏所属专栏:深入理解C语言📔作者简介:更新有关深入理解C语言知识的博主一枚,记录分享自己对C语言的深入解读。😆个人主页:[₽]的个人主页🏄…...
ESP8266智能家居(3)——单片机数据发送到mqtt服务器
1.主要思想 前期已学习如何用ESP8266连接WIFI,并发送数据到服务器。现在只需要在单片机与nodeMCU之间建立起串口通信,这样单片机就可以将传感器测到的数据:光照,温度,湿度等等传递给8266了,然后8266再对数据…...
lvm逻辑卷创建raid阵列(不常用)—— 筑梦之路
RAID卷介绍 逻辑卷管理器(LVM)不仅仅可以将多个磁盘和分区聚合到一个逻辑卷中,以此提高单个分区的存储容量,还可以创建和管理独立磁盘的冗余阵列(RAID)卷,防止磁盘故障并提高性能。它支持常用的RAID级别,支持的RAID的级别有 0、1…...
LayUI发送Ajax请求
页面初始化操作 var processData null $(function () {initView();initTable();// test(); })function initView() {layui.use([laydate, form], function () {var laydate layui.laydate;laydate.render({elem: #applyDateTimeRange,type: datetime,range: true});}); }初始…...
平时积累的FPGA知识点(10)
平时在FPGA群聊等积累的FPGA知识点,第10期: 41 ZYNQ系列芯片的PL中使用PS端送过来的时钟,这些时钟名字是自动生成的吗? 解释:是的。PS端设置的是ps_clk,用report_clocks查出来的时钟名变成了clk_fpga_0&a…...
使用Streamlit构建纯LLM Chatbot WebUI傻瓜教程
文章目录 使用Streamlit构建纯LLM Chatbot WebUI傻瓜教程开发环境hello Streatelit显示DataFrame数据显示地图WebUI左右布局设置st.sidebar左侧布局st.columns右侧布局 大语言模型LLM Chatbot WebUI设置Chatbot页面布局showdataframe()显示dataframeshowLineChart()显示折线图s…...
电脑死机卡住怎么办 电脑卡住鼠标也点不动的解决方法
在我们使用电脑的过程中,可能由于电脑硬件或者软件的问题,偶尔会出现电脑卡住的情况,很多电脑小白都不知道电脑卡住了怎么办,鼠标也点不动,键盘也没用,一旦发生了这种情况,大家可以来参考一下小编分享的电脑死机卡住的解决方法。 电脑卡住鼠标也点不动的解决方法 方…...
RAG 语义分块实践
每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 原文标题:Semantic chunking in practice 原文地址:https://medium.com/@boudhayan-dev/semantic-chunking-in-practice-23a8bc33d56d 语义分块的实践 回顾 …...
12 Autosar_SWS_MemoryMapping.pdf解读
AUTOSAR中MemMap_autosar memmap-CSDN博客 1、Memory Map的作用 1.1 避免RAM的浪费:不同类型的变量,为了对齐造成的空间两份; 1.2 特殊RAM的用途:比如一些变量通过位掩码来获取,如果map到特定RAM可以通过编译器的位掩码…...
【Linux取经路】文件系统之缓冲区
文章目录 一、先看现象二、用户缓冲区的引入三、用户缓冲区的刷新策略四、为什么要有用户缓冲区五、现象解释六、结语 一、先看现象 #include <stdio.h> #include <string.h> #include <unistd.h>int main() {const char* fstr "Hello fwrite\n"…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
