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

[学习] C语言<string.h>中字符串函数全解析

C语言<string.h>中字符串函数全解析

在 C 语言中,字符串处理是程序开发中的重要组成部分。C 标准库 <string.h> 提供了一系列函数用于操作字符数组(即字符串)。这些函数以 str 开头,功能强大、使用广泛,掌握它们对编写高效、安全的字符串处理代码至关重要。

下面将详细介绍所有常用的字符串处理函数,包括其 函数原型参数说明返回值含义 以及 完整示例代码

📢 如果你正在学习 C 语言或准备面试,请收藏此篇,作为你的字符串函数速查手册!


文章目录

  • C语言<string.h>中字符串函数全解析
    • 🔹1. `strcpy()` —— 字符串拷贝
      • 函数原型:
      • 完整示例:
    • 🔹2. `strncpy()` —— 指定长度的字符串拷贝
      • 函数原型:
      • 完整示例:
    • 🔹3. `strcat()` —— 字符串拼接
      • 函数原型:
      • 完整示例:
    • 🔹4. `strncat()` —— 指定长度的字符串拼接
      • 函数原型:
      • 完整示例:
    • 🔹5. `strcmp()` —— 字符串比较
      • 函数原型:
      • 完整示例:
    • 🔹6. `strncmp()` —— 指定长度的字符串比较
      • 函数原型:
      • 完整示例:
    • 🔹7. `strlen()` —— 获取字符串长度
      • 函数原型:
      • 完整示例:
    • 🔹8. `strchr()` —— 查找字符首次出现位置
      • 函数原型:
      • 完整示例:
    • 🔹9. `strrchr()` —— 查找字符最后一次出现位置
      • 函数原型:
      • 完整示例:
    • 🔹10. `strstr()` —— 查找子字符串首次出现位置
      • 函数原型:
      • 完整示例:
    • 🔹11. `strspn()` —— 计算前缀匹配长度
      • 函数原型:
      • 完整示例:
    • 🔹12. `strcspn()` —— 计算前缀不含某字符集的长度
      • 函数原型:
      • 完整示例:
    • 🔹13. `strpbrk()` —— 查找第一个出现在指定字符集中的字符
      • 函数原型:
      • 完整示例:
    • 🔹14. `strdup()` —— 字符串复制(非标准但常用)
      • 函数原型(POSIX扩展):
      • 完整示例:
    • 🔹15. `strndup()` —— 指定长度的字符串复制(GNU扩展)
      • 函数原型:
      • 完整示例:
    • 🔹16. `strerror()` —— 根据错误码获取描述信息
      • 函数原型:
      • 完整示例:
    • 🔹17. `strtok()` / `strtok_r()` —— 字符串分割
      • 函数原型:
      • 完整示例(strtok):
      • 完整示例(strtok_r):
    • 🔹18. `strcoll()` —— 按照当前区域设置比较字符串
      • 函数原型:
      • 完整示例:
    • 🔹19. `strxfrm()` —— 将字符串转换为可排序形式
      • 函数原型:
      • 完整示例:
    • ✅ 总结表格


🔹1. strcpy() —— 字符串拷贝

函数原型:

char *strcpy(char *dest, const char *src);

完整示例:

#include <stdio.h>
#include <string.h>int main() {char src[] = "Hello World";char dest[50];strcpy(dest, src);printf("Copied string: %s\n", dest);return 0;
}

🔹2. strncpy() —— 指定长度的字符串拷贝

函数原型:

char *strncpy(char *dest, const char *src, size_t n);

完整示例:

#include <stdio.h>
#include <string.h>int main() {char src[] = "abcdefg";char dest[10];strncpy(dest, src, 3);dest[3] = '\0'; // 手动补结束符printf("Copied substring: %s\n", dest);return 0;
}

🔹3. strcat() —— 字符串拼接

函数原型:

char *strcat(char *dest, const char *src);

完整示例:

#include <stdio.h>
#include <string.h>int main() {char dest[50] = "Hello ";strcat(dest, "World");printf("Concatenated string: %s\n", dest);return 0;
}

🔹4. strncat() —— 指定长度的字符串拼接

函数原型:

char *strncat(char *dest, const char *src, size_t n);

完整示例:

#include <stdio.h>
#include <string.h>int main() {char dest[50] = "Hello ";strncat(dest, "World!", 3);printf("Concatenated substring: %s\n", dest);return 0;
}

🔹5. strcmp() —— 字符串比较

函数原型:

int strcmp(const char *s1, const char *s2);

完整示例:

#include <stdio.h>
#include <string.h>int main() {if (strcmp("apple", "banana") < 0) {printf("apple comes before banana\n");} else {printf("apple does not come before banana\n");}return 0;
}

🔹6. strncmp() —— 指定长度的字符串比较

函数原型:

int strncmp(const char *s1, const char *s2, size_t n);

完整示例:

#include <stdio.h>
#include <string.h>int main() {if (strncmp("hello world", "hello there", 5) == 0) {printf("First 5 characters are equal.\n");} else {printf("First 5 characters are different.\n");}return 0;
}

🔹7. strlen() —— 获取字符串长度

函数原型:

size_t strlen(const char *s);

完整示例:

#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello";printf("Length of '%s': %zu\n", str, strlen(str));return 0;
}

🔹8. strchr() —— 查找字符首次出现位置

函数原型:

char *strchr(const char *s, int c);

完整示例:

#include <stdio.h>
#include <string.h>int main() {const char *str = "abcdefg";char *p = strchr(str, 'd');if (p) {printf("Found 'd' at position: %ld\n", p - str);} else {printf("'d' not found\n");}return 0;
}

🔹9. strrchr() —— 查找字符最后一次出现位置

函数原型:

char *strrchr(const char *s, int c);

完整示例:

#include <stdio.h>
#include <string.h>int main() {const char *str = "abracadabra";char *p = strrchr(str, 'a');if (p) {printf("Last 'a' at index: %ld\n", p - str);} else {printf("'a' not found\n");}return 0;
}

🔹10. strstr() —— 查找子字符串首次出现位置

函数原型:

char *strstr(const char *haystack, const char *needle);

完整示例:

#include <stdio.h>
#include <string.h>int main() {const char *text = "Hello World";const char *pattern = "World";char *p = strstr(text, pattern);if (p) {printf("Found '%s' at index: %ld\n", pattern, p - text);} else {printf("'%s' not found\n", pattern);}return 0;
}

🔹11. strspn() —— 计算前缀匹配长度

函数原型:

size_t strspn(const char *s, const char *accept);

完整示例:

#include <stdio.h>
#include <string.h>int main() {const char *str = "123abc";const char *digits = "0123456789";size_t len = strspn(str, digits);printf("Prefix length: %zu\n", len); // 输出 3return 0;
}

🔹12. strcspn() —— 计算前缀不含某字符集的长度

函数原型:

size_t strcspn(const char *s, const char *reject);

完整示例:

#include <stdio.h>
#include <string.h>int main() {const char *str = "hello world";size_t len = strcspn(str, " ");printf("First word length: %zu\n", len); // 输出 5return 0;
}

🔹13. strpbrk() —— 查找第一个出现在指定字符集中的字符

函数原型:

char *strpbrk(const char *s, const char *accept);

完整示例:

#include <stdio.h>
#include <string.h>int main() {const char *str = "abcdefg";const char *chars = "xyzc";char *p = strpbrk(str, chars);if (p) {printf("Found '%c' at index: %ld\n", *p, p - str);} else {printf("No match found\n");}return 0;
}

🔹14. strdup() —— 字符串复制(非标准但常用)

函数原型(POSIX扩展):

char *strdup(const char *s);

完整示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {const char *original = "Dynamic copy";char *copy = strdup(original);if (copy) {printf("Copy: %s\n", copy);free(copy);} else {printf("Memory allocation failed\n");}return 0;
}

🔹15. strndup() —— 指定长度的字符串复制(GNU扩展)

函数原型:

char *strndup(const char *s, size_t n);

完整示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {const char *original = "abcdefgh";char *copy = strndup(original, 4);if (copy) {printf("Copy: %s\n", copy);free(copy);} else {printf("Memory allocation failed\n");}return 0;
}

🔹16. strerror() —— 根据错误码获取描述信息

函数原型:

char *strerror(int errnum);

完整示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main() {FILE *fp = fopen("nonexistent.txt", "r");if (!fp) {printf("Error: %s\n", strerror(errno));}return 0;
}

🔹17. strtok() / strtok_r() —— 字符串分割

函数原型:

char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr); // 线程安全版本

完整示例(strtok):

#include <stdio.h>
#include <string.h>int main() {char str[] = "apple,banana,orange";char *token = strtok(str, ",");while (token) {printf("Token: %s\n", token);token = strtok(NULL, ",");}return 0;
}

完整示例(strtok_r):

#include <stdio.h>
#include <string.h>int main() {char str[] = "apple,banana,orange";char *saveptr;char *token = strtok_r(str, ",", &saveptr);while (token) {printf("Token: %s\n", token);token = strtok_r(NULL, ",", &saveptr);}return 0;
}

🔹18. strcoll() —— 按照当前区域设置比较字符串

函数原型:

int strcoll(const char *s1, const char *s2);

完整示例:

#include <stdio.h>
#include <string.h>
#include <locale.h>int main() {setlocale(LC_COLLATE, "zh_CN.UTF-8"); // 设置中文区域const char *s1 = "苹果";const char *s2 = "香蕉";int result = strcoll(s1, s2);if (result < 0) {printf("%s comes before %s\n", s1, s2);} else if (result > 0) {printf("%s comes after %s\n", s1, s2);} else {printf("%s and %s are equal\n", s1, s2);}return 0;
}

🔹19. strxfrm() —— 将字符串转换为可排序形式

函数原型:

size_t strxfrm(char *dest, const char *src, size_t n);

完整示例:

#include <stdio.h>
#include <string.h>
#include <locale.h>int main() {setlocale(LC_COLLATE, "zh_CN.UTF-8");const char *src = "苹果";char dest[100];size_t len = strxfrm(dest, src, sizeof(dest));printf("Transformed string: %s (length: %zu)\n", dest, len);return 0;
}

✅ 总结表格

函数名功能是否线程安全头文件
strcpy拷贝字符串<string.h>
strncpy指定长度拷贝<string.h>
strcat拼接字符串<string.h>
strncat指定长度拼接<string.h>
strcmp比较字符串<string.h>
strncmp指定长度比较<string.h>
strlen获取字符串长度<string.h>
strchr查找字符首次出现<string.h>
strrchr查找字符最后一次出现<string.h>
strstr查找子字符串<string.h>
strspn匹配前缀字符<string.h>
strcspn匹配前缀不含字符<string.h>
strpbrk查找任意字符首次出现<string.h>
strdup复制字符串(需手动释放)<string.h>
strndup指定长度复制<string.h>
strerror错误码转字符串<string.h> <errno.h>
strtok/strtok_r分割字符串❌ / ✅<string.h>
strcoll按区域设置比较<string.h>
strxfrm转换为可排序形式<string.h>

📌 提示建议:

  • 使用时务必注意边界和空指针问题;
  • 推荐使用更安全的替代函数如 strncpy, strncat
  • 在多线程环境中优先使用 _r 版本(如 strtok_r);
  • 对字符串操作频繁的项目可考虑使用 C++ 的 std::string 或其他封装库。

研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)


相关文章:

  • java专题漏洞总结 + 靶场练习
  • 开源 python 应用 开发(二)基于pyautogui、open cv 视觉识别的工具自动化
  • 关于程序的基本要素的详细讲解(从属GESP一级内容)
  • 端侧调用云存储实现头像存储
  • 查看shell选项状态命令详解
  • CentOS7.6 yum无法下载
  • 《HTTP权威指南》 第14章 安全HTTP
  • 小木的算法日记——合成两个有序链表
  • 系统思考:救火先放火
  • 优化通义大模型推理性能:企业级场景下的延迟与成本削减策略
  • 桌面小屏幕实战课程:DesktopScreen 3 Git工具使用
  • 21.安卓逆向2-frida hook技术-HookOkHttp的拦截器
  • 数智管理学(二十四)
  • C++ -- AVL树的插入和旋转
  • Linux 线程调度管理函数
  • leetcode:21. 合并两个有序链表
  • 华为云Flexus+DeepSeek征文|基于Dify构建解析网页写入Notion笔记工作流
  • 【C++】C++枚举、const、static的用法
  • LLM存储优化:大量长对话解决方案
  • C++ - 标准库之 <string> npos(npos 概述、npos 的作用)
  • 网站footer内容/模板建站
  • 南山做网站多少钱/推广网站推广
  • 旅游景点网站策划书/三亚百度推广公司
  • 网站文章优化怎么做/做推广公司
  • 郑州网站建设服务商/seo网站推广工具
  • 网站建设做网站/保定关键词优化软件