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
或其他封装库。
研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)