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 或其他封装库。

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85739.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85739.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/85739.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OJ搭建:Judge0服务器、DeepSeek服务接入简介

序 各大OJ平台上有很多很好的资源&#xff0c;但作为自己的“备课本”总有各种不便&#xff0c;教学生时间久了总是有一些自己的题目和想法&#xff0c;这在教初学的学生时非常突出。所以&#xff0c;很多年前就搞了一些尝试&#xff0c;包括&#xff1a;在机房搭建ubuntu服务器…

Java的锁机制问题

锁机制 1.锁监视器 在 Java 并发编程中&#xff0c;锁监视器&#xff08;Monitor&#xff09; 是对象内部与锁关联的同步机制&#xff0c;用于控制多线程对共享资源的访问。以下是核心要点&#xff1a; &#x1f512; 监视器的核心组成 独占区&#xff08;Ownership&#xff…

老凤祥的AI智能眼镜:让智慧更近生活

在科技进步的潮流中,人工智能技术不断为我们的生活增添色彩。近日,有关字节跳动旗下的火山引擎与中国珠宝品牌老凤祥合作开发 AI 智能眼镜的消息引发了广泛关注。这款与众不同的眼镜因其独特的功能及技术支持,已经在业内引起了极大反响。 AI眼镜:老年群体的智能好帮手 根…

Kotlin 中为什么没有静态变量和静态方法—不用static?

Kotlin 的设计核心是&#xff1a; 一切皆对象&#xff1a;消除 static 的「非对象」特性&#xff0c;用 companion&#xff08;对象&#xff09;和顶层函数&#xff08;包级对象&#xff09;替代&#xff0c;让代码更统一。避免全局状态滥用&#xff1a;static 成员是全局可见…

VSCode性能调优:从卡顿到丝滑的终极方案

⚡ 核心价值 "这套配置使某金融核心系统VS Code内存占用从8GB降至1.2GB,加载速度提升15倍" —— 2024某银行效能优化报告 🧩 性能瓶颈拆解 一、百万行项目优化方案 🚀 黄金配置参数 // settings.json(核弹级优化) {"files.watcherExclude": {"…

以云织梦,渡数济世:辉瑞与亚马逊云科技共谱医药新乐章

胖头陀科技 编辑&#xff1a;沐由 【导读】“用合规的数据来帮助患者&#xff0c;成为患者回归健康的一味新药。”当下&#xff0c;在数字洪流的浪潮中&#xff0c;这味“良药”正沿着云和AI的脉络&#xff0c;奔向有需求的千家万户…… 如果说到Pfizer&#xff0c;估计十个人…

SpringBoot后端开发知识点总结(持续更新)

目录 1. 常用易混淆注解解释1.1 Resource和Autowired注解的区别1.2 PathVariable和RequestParam注解的区别 2. Mybatis-Plus高级特性2.1 强大的通用CRUD接口2.2 代码生成器 3. IDEA实用快捷键4. 前后端联调关键点4.1 代码示例4.2 联调要点4.3 调试技巧 1. 常用易混淆注解解释 …

电脑商城--用户收货管理

新增收货地址 1 新增收货地址-创建数据表 1.使用use命令先选中store数据库。 USE store; 2.在store数据库中创建t_address用户数据表。 CREATE TABLE t_address (aid INT AUTO_INCREMENT COMMENT 收货地址id,uid INT COMMENT 归属的用户id,name VARCHAR(20) COMMENT 收货人姓…

开发者避坑:接入Flux-Kontext API实现文生图、图生图功能

在数字化浪潮背景下&#xff0c;人工智能&#xff08;Artificial Intelligence, AI&#xff09;技术正加速重塑图像创作领域。智创聚合API平台近日宣布整合Flux-Kontext系列模型&#xff0c;通过API接口支持图生图和文生图功能&#xff0c;为开发者及创作者提供高效解决方案。此…

.Net Core 获取与bin目录相同文件路径的文件

在 .NET Core 中&#xff0c;您可以使用以下方法来获取与 bin 目录相同的文件路径。通常&#xff0c;bin 目录是应用程序编译后生成的输出目录&#xff0c;您可以使用 AppContext.BaseDirectory 或 Directory.GetCurrentDirectory() 来获取该目录的路径。 以下是一些常用的方法…

RN(React Native)技术应用中常出现的错误及解决办法

React Native 作为跨平台开发框架&#xff0c;在实际应用中可能会遇到一些常见的错误。以下是React Native 技术应用中常出现的错误及解决办法&#xff1a; 1. 网络请求失败&#xff08;Network Request Failed&#xff09; 原因&#xff1a; 请求地址不正确网络权限未配置i…

Java 21 的虚拟线程与桥接模式:构建高性能并发系统

Java 21 的虚拟线程与桥接模式&#xff1a;构建高性能并发系统 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…

HTML5 火焰字体效果教程

HTML5 火焰字体效果教程 这里写目录标题 HTML5 火焰字体效果教程前言项目概述基本原理项目结构详细实现步骤1. HTML结构2. CSS样式3. JavaScript实现 代码详解1. 初始化设置2. 粒子系统3. 生成粒子4. 动画循环5. 交互控制 扩展和优化建议总结完整代码 前言 在这篇教程中&#…

SMOTE-XGBoost实战:金融风控中欺诈检测的样本不平衡解决方案

1. 行业问题背景 &#xff08;1&#xff09;金融欺诈检测的特殊性 在支付风控领域&#xff0c;样本不平衡是核心痛点。Visa 2023年度报告显示&#xff0c;全球信用卡欺诈率约为0.6%&#xff0c;但单笔欺诈交易平均损失高达$500。传统机器学习模型在此场景下表现堪忧&#xff1…

Instagram下载保存 -下载狗解析工具

在日常浏览Instagram时&#xff0c;是否有过这样的烦恼&#xff1a;看到一个精彩的视频&#xff0c;想要保存下来&#xff0c;却不知道如何操作&#xff1f;有时候我们会看到一些特别的旅行视频、搞笑片段&#xff0c;甚至是喜欢的名人分享的内容&#xff0c;简直是舍不得错过。…

flink如何基于Pekko实现RPC调用

摘要 通过阅读flink源码&#xff0c;了解flink是如何基于Pekko实现远程RPC调用的 Pekko实现远程调用 Flink 的 RPC 框架底层是构建在 Pekko 的 actor 模型之上的&#xff0c;了解Pekko如何使用&#xff0c;对后续源码的阅读有帮助。 Apache Pekko&#xff08;原为 Akka 的一…

Kafka节点注册冲突问题分析与解决

一、核心错误分析 ERROR Error while creating ephemeral at /brokers/ids/1, node already exists and owner does not match org.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode NodeExists问题本质&#xff1a;ZooKeeper中已存在ID为1的broker节…

突破PPO训练效率瓶颈!字节跳动提出T-PPO,推理LLM训练速度提升2.5倍

突破PPO训练效率瓶颈&#xff01;字节跳动提出T-PPO&#xff0c;推理LLM训练速度提升2.5倍 在大语言模型&#xff08;LLM&#xff09;通过长思维链&#xff08;CoT&#xff09;展现出强大推理能力的当下&#xff0c;强化学习&#xff08;RL&#xff09;作为关键技术却面临训练…

【Python】dictionary

1 字典功能 字典是可变容器模型&#xff0c;且可存储任意类型对象&#xff1b; 字典的每个键值对 <key: value> 用冒号 : 分割&#xff0c;每个对之间用逗号(,)分割&#xff0c;整个字典包括在花括号 {} 中 ,格式如下所示&#xff1a; d {key1 : value1, key2 : value…

【python】If 语句

1 使用if 进行条件判断 1.1 检查字符串是否相等 car bmw car BMW # FALSEcar bmw car.upper() BMW # true # 变小写用方法&#xff1a;lower1.2 检查字符串是否不相等 my_car yadeaif my_car ! Audi:print("Buy one! Buy one! Buy one!")1.3 比较数字 answe…