当前位置: 首页 > news >正文

C语言标准库介绍:<string.h>

在C语言中,<string.h>头文件是标准库中的一个重要部分,它定义了一系列操作字符串和字符数组的函数。本文将详细介绍<string.h>头文件中包含的22个函数,并提供每个函数的完整示例代码。

简介

<string.h>头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。在使用这些函数之前,我们首先来了解一下相关的库变量和宏。

库变量

<string.h>头文件中定义的变量类型如下:

  1. size_t: 无符号整数类型,通常用于表示内存块的大小。它是 sizeof 关键字的结果。

库宏

<string.h>头文件中定义的宏如下:

  1. 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语言中&#xff0c;<string.h>头文件是标准库中的一个重要部分&#xff0c;它定义了一系列操作字符串和字符数组的函数。本文将详细介绍<string.h>头文件中包含的22个函数&#xff0c;并提供每个函数的完整示例代码。 简介 <string.h>头文件定义了一个变…...

大语言模型LangChain本地知识库:向量数据库与文件处理技术的深度整合

文章目录 大语言模型LangChain本地知识库&#xff1a;向量数据库与文件处理技术的深度整合引言向量数据库在LangChain知识库中的应用文件处理技术在知识库中的角色向量数据库与文件处理技术的整合实践挑战与展望结论 大语言模型LangChain本地知识库&#xff1a;向量数据库与文件…...

展厅设计中都包含哪些分区与展示内容

1、欢迎区 欢迎区是展厅的入口处&#xff0c;通常展示企业品牌、企业标志和企业形象等内容。这个区域通常会有一个欢迎台&#xff0c;展示企业的宣传片、简介和最新资讯等。 2、产品展示区 产品展示区是展示企业产品的区域&#xff0c;展示的产品包括企业主营产品、新产品和重点…...

【k8s核心概念与专业术语】

k8s架构 1、服务的分类 服务分类按如下图根据数据服务支撑&#xff0c;分为无状态和有状态 无状态引用如下所示&#xff0c;如果一个nginx服务&#xff0c;删除后重新部署有可以访问&#xff0c;这个属于无状态&#xff0c;不涉及到数据存储。 有状态服务&#xff0c;如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轻量级神经网络模型

一、参考资料 原始论文&#xff1a;[1] PyTorch代码链接&#xff1a;Efficient-AI-Backbones MindSpore代码&#xff1a;ghostnet_d 解读模型压缩5&#xff1a;减少冗余特征的Ghost模块&#xff1a;华为Ghost网络系列解读 GhostNet论文解析&#xff1a;Ghost Module CVPR…...

P8630 [蓝桥杯 2015 国 B] 密文搜索

P8630 [蓝桥杯 2015 国 B] 密文搜索 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P8630 题目分析 基本上是hash的板子&#xff0c;但实际上对于密码串&#xff0c;只要判断主串中任意连续的八个位置是否存在密码串即可&#xff1b;那么我们…...

Electron实战之环境搭建

工欲善其事必先利其器&#xff0c;在进行实战开发的时候&#xff0c;我们最终的步骤是搞好一个舒服的开发环境&#xff0c;目前支持 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.打家劫舍 题目链接&#xff1a;https://leetcode.cn/problems/house-robber/ 思路&#xff1a;小偷不…...

深入理解C语言(5):程序环境和预处理详解

文章主题&#xff1a;程序环境和预处理详解&#x1f30f;所属专栏&#xff1a;深入理解C语言&#x1f4d4;作者简介&#xff1a;更新有关深入理解C语言知识的博主一枚&#xff0c;记录分享自己对C语言的深入解读。&#x1f606;个人主页&#xff1a;[₽]的个人主页&#x1f3c4…...

ESP8266智能家居(3)——单片机数据发送到mqtt服务器

1.主要思想 前期已学习如何用ESP8266连接WIFI&#xff0c;并发送数据到服务器。现在只需要在单片机与nodeMCU之间建立起串口通信&#xff0c;这样单片机就可以将传感器测到的数据&#xff1a;光照&#xff0c;温度&#xff0c;湿度等等传递给8266了&#xff0c;然后8266再对数据…...

lvm逻辑卷创建raid阵列(不常用)—— 筑梦之路

RAID卷介绍 逻辑卷管理器(LVM)不仅仅可以将多个磁盘和分区聚合到一个逻辑卷中&#xff0c;以此提高单个分区的存储容量&#xff0c;还可以创建和管理独立磁盘的冗余阵列(RAID)卷&#xff0c;防止磁盘故障并提高性能。它支持常用的RAID级别&#xff0c;支持的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知识点&#xff0c;第10期&#xff1a; 41 ZYNQ系列芯片的PL中使用PS端送过来的时钟&#xff0c;这些时钟名字是自动生成的吗&#xff1f; 解释&#xff1a;是的。PS端设置的是ps_clk&#xff0c;用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的浪费&#xff1a;不同类型的变量&#xff0c;为了对齐造成的空间两份&#xff1b; 1.2 特殊RAM的用途&#xff1a;比如一些变量通过位掩码来获取&#xff0c;如果map到特定RAM可以通过编译器的位掩码…...

【Linux取经路】文件系统之缓冲区

文章目录 一、先看现象二、用户缓冲区的引入三、用户缓冲区的刷新策略四、为什么要有用户缓冲区五、现象解释六、结语 一、先看现象 #include <stdio.h> #include <string.h> #include <unistd.h>int main() {const char* fstr "Hello fwrite\n"…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...