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"…...
Perplexity国际新闻搜索深度解析(全球记者都在用的AI情报工作流)
更多请点击: https://codechina.net 第一章:Perplexity国际新闻搜索深度解析(全球记者都在用的AI情报工作流) Perplexity 不仅是问答引擎,更是现代调查记者与情报分析师的“实时新闻雷达”。其核心优势在于融合权威信…...
别再只盯着p值和FC了!用DisGeNET给你的Hub Gene打分,提升下游验证成功率
别再只盯着p值和FC了!用DisGeNET给你的Hub Gene打分,提升下游验证成功率 在基因功能研究的海洋中,Hub Gene如同灯塔般指引着研究方向。然而,许多研究者仍被困在传统筛选方法的局限中——过度依赖差异表达基因的p值和fold change阈…...
linux service和systemctl命令、systemd
文章目录service命令(老版本)systemctl命令(推荐)systemdsystemd示例-Hello Worldsystemd语法如何查看service对应的脚本service命令(老版本) 都是服务控制相关的命令,差别不大,之前用service,现在一般用systemctl。 service命令例子&#…...
Vue3后台管理系统终极指南:V3 Admin Vite 5.0全面解析
Vue3后台管理系统终极指南:V3 Admin Vite 5.0全面解析 【免费下载链接】v3-admin-vite ☀️ A crafted Vue3 admin template | Vue Admin | Vue Template | Vue3 Admin | Vue3 Template | Vue 后台 | Vue 模板 | Vue3 后台 | Vue3 模板 项目地址: https://gitcode…...
利用模型广场为不同文本处理任务选择合适的大模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用模型广场为不同文本处理任务选择合适的大模型 面对创意写作、代码生成、文档总结等多样化的AI任务,开发者或产品经…...
Java JVM 面试题详解:JVM运行原理、内存模型、堆栈方法区、GC垃圾回收、JIT编译、类加载机制与线上调优全攻略
1. JVM 到底是什么?为什么 Java 程序离不开它?JVM,全称 Java Virtual Machine,可以理解为 Java 字节码的运行平台。Java 代码先被 javac 编译成 class 字节码,再由 JVM 负责加载、解释、编译、执行和管理内存。这样 Ja…...
本地大模型部署的Python“翻译官“:llama-cpp-python深度解析
本地大模型部署的Python"翻译官":llama-cpp-python深度解析 【免费下载链接】llama-cpp-python Python bindings for llama.cpp 项目地址: https://gitcode.com/gh_mirrors/ll/llama-cpp-python 你是否曾为云端API的延迟而焦虑?是否担心…...
拆解Xilinx UltraScale GTH收发器时钟网络:从QPLL/CPLL选择到TXUSRCLK生成的全链路分析
拆解Xilinx UltraScale GTH收发器时钟网络:从QPLL/CPLL选择到TXUSRCLK生成的全链路分析 在高速串行通信领域,时钟网络的稳定性直接决定了系统性能上限。当我们面对25Gbps甚至更高速率的设计需求时,Xilinx UltraScale架构中的GTH收发器便成为工…...
铸件去毛刺,伯朗特机器人带气动打磨头,恒力去除浇口残余
在铸造行业,无论是金属还是非金属铸件,脱模后都会不可避免地产生飞边、毛刺及浇口残余。这些瑕疵不仅影响产品外观,更可能妨碍后续装配,甚至在部件受力时成为应力集中点,影响产品使用寿命与安全性。传统的人工去毛刺作…...
2023B卷,跳格子(1)
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:华为OD面试 文章目录 一、🍀前言 1.1 ☘️题目详情 1.2 ☘️参考解题答案 一、🍀前言 2023B卷,跳格子(1) 。 1.1 ☘️题目详情 题目: 小明和朋友…...
