当前位置: 首页 > 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个函数,并提供了每个函数的完整示例代码。这些函数在处理字符串和字符数组时非常有用,可以帮助开发人员轻松地进行字符串操作和处理。

http://www.lryc.cn/news/304387.html

相关文章:

  • 大语言模型LangChain本地知识库:向量数据库与文件处理技术的深度整合
  • 展厅设计中都包含哪些分区与展示内容
  • 【k8s核心概念与专业术语】
  • 【stm32】hal库学习笔记-UART/USART串口通信(超详细!)
  • 通俗易懂理解GhostNetV1轻量级神经网络模型
  • P8630 [蓝桥杯 2015 国 B] 密文搜索
  • Electron实战之环境搭建
  • 【0259】inval.h/inval.c的理解
  • 力扣爆刷第77天--动态规划一网打尽打家劫舍问题
  • 深入理解C语言(5):程序环境和预处理详解
  • ESP8266智能家居(3)——单片机数据发送到mqtt服务器
  • lvm逻辑卷创建raid阵列(不常用)—— 筑梦之路
  • LayUI发送Ajax请求
  • 平时积累的FPGA知识点(10)
  • 使用Streamlit构建纯LLM Chatbot WebUI傻瓜教程
  • 电脑死机卡住怎么办 电脑卡住鼠标也点不动的解决方法
  • RAG 语义分块实践
  • 12 Autosar_SWS_MemoryMapping.pdf解读
  • 【Linux取经路】文件系统之缓冲区
  • 华为OD机试真题-查找接口成功率最优时间段-2023年OD统一考试(C卷)--Python3--开源
  • 缓存篇—缓存雪崩、缓存击穿、缓存穿透
  • Python实现视频转音频、音频转文本的最佳方法
  • 阿里云SSL免费证书到期自动申请部署程序
  • Vue全局事件防止重复点击(等待请求)【进阶版】
  • C#程序反编译经验总结
  • Android系统启动流程
  • Flask——基于python完整实现客户端和服务器后端流式请求及响应
  • crmeb多门店商城系统二次开发 增加车辆车牌搜索功能、车辆公里数
  • 深度好文|关于人类智能与自主系统
  • 防火墙内容安全笔记