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"…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
