C语言
在 C 语言中,字符串处理是程序开发中的重要组成部分。C 标准库
📢 如果你正在学习 C 语言或准备面试,请收藏此篇,作为你的字符串函数速查手册!
文章目录
C语言
🔹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);
参数说明:
dest:指向目标字符数组的指针,用于存储复制后的字符串。src:指向源字符串的指针,该字符串将被复制到 dest 中。
返回值:
返回指向 dest 的指针。
示例:
#include
#include
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);
参数说明:
dest:目标缓冲区。src:源字符串。n:最多拷贝的字符数。
返回值:
返回指向 dest 的指针。
示例:
#include
#include
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);
参数说明:
dest:原字符串,必须有足够空间容纳结果。src:要拼接到 dest 后面的字符串。
返回值:
返回指向 dest 的指针。
示例:
#include
#include
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);
参数说明:
dest:原字符串。src:要拼接的字符串。n:最多拼接的字符数。
返回值:
返回指向 dest 的指针。
示例:
#include
#include
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);
参数说明:
s1:第一个待比较的字符串。s2:第二个待比较的字符串。
返回值:
小于 0:s1 < s2等于 0:s1 == s2大于 0:s1 > s2
示例:
#include
#include
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);
参数说明:
s1:第一个字符串。s2:第二个字符串。n:最多比较的字符数。
返回值:
同上。
示例:
#include
#include
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);
参数说明:
s:要计算长度的字符串。
返回值:
返回字符串 s 的长度(不包括终止符 \0)。
示例:
#include
#include
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);
参数说明:
s:要查找的字符串。c:要查找的字符(会被隐式转换为 char 类型)。
返回值:
返回指向第一次出现的位置的指针;若未找到,则返回 NULL。
示例:
#include
#include
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);
参数说明:
s:要查找的字符串。c:要查找的字符。
返回值:
返回最后一次出现的指针;未找到则返回 NULL。
示例:
#include
#include
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);
参数说明:
haystack:主字符串。needle:要查找的子字符串。
返回值:
返回匹配子串起始位置的指针;未找到则返回 NULL。
示例:
#include
#include
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);
参数说明:
s:要检查的字符串。accept:允许的字符集合。
返回值:
返回从开头开始连续属于 accept 中字符的最大长度。
示例:
#include
#include
int main() {
const char *str = "123abc";
const char *digits = "0123456789";
size_t len = strspn(str, digits);
printf("Prefix length: %zu\n", len); // 输出 3
return 0;
}
🔹12. strcspn() —— 计算前缀不含某字符集的长度
函数原型:
size_t strcspn(const char *s, const char *reject);
参数说明:
s:要检查的字符串。reject:不允许出现的字符集合。
返回值:
返回从开头开始连续不属于 reject 中字符的最大长度。
示例:
#include
#include
int main() {
const char *str = "hello world";
size_t len = strcspn(str, " ");
printf("First word length: %zu\n", len); // 输出 5
return 0;
}
🔹13. strpbrk() —— 查找第一个出现在指定字符集中的字符
函数原型:
char *strpbrk(const char *s, const char *accept);
参数说明:
s:要查找的字符串。accept:允许出现的字符集合。
返回值:
返回第一个出现在 accept 中的字符指针;未找到则返回 NULL。
示例:
#include
#include
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);
参数说明:
s:要复制的字符串。
返回值:
返回新分配的字符串副本,需手动调用 free() 释放。
示例:
#include
#include
#include
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);
参数说明:
s:要复制的字符串。n:最多复制的字符数。
返回值:
返回最多复制 n 个字符的新字符串副本。
示例:
#include
#include
#include
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);
参数说明:
errnum:系统错误码(通常来自 errno)。
返回值:
返回对应错误码的可读性错误信息字符串。
示例:
#include
#include
#include
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);
参数说明:
str:待分割的字符串(首次调用传入)。delim:分隔符字符串。saveptr:保存内部状态(用于 strtok_r)。
示例(strtok):
#include
#include
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
#include
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);
参数说明:
s1:第一个字符串。s2:第二个字符串。
返回值:
同 strcmp(),但考虑了区域设置。
示例:
#include
#include
#include
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);
参数说明:
dest:转换后字符串的存放位置。src:原始字符串。n:最大写入字节数。
返回值:
返回转换后字符串的实际长度(不包括 \0)。
示例:
#include
#include
#include
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(dest, src)拷贝字符串dest: 目标缓冲区; src: 源字符串❌strncpy(dest, src, n)指定长度拷贝n: 最多拷贝字符数❌strcat(dest, src)拼接字符串dest: 原字符串; src: 要拼接的字符串❌strncat(dest, src, n)指定长度拼接n: 最多拼接字符数❌strcmp(s1, s2)比较字符串s1, s2: 待比较的两个字符串✅strncmp(s1, s2, n)指定长度比较n: 最多比较字符数✅strlen(s)获取字符串长度s: 要计算长度的字符串✅strchr(s, c)查找字符首次出现c: 要查找的字符✅strrchr(s, c)查找字符最后一次出现c: 要查找的字符✅strstr(haystack, needle)查找子字符串haystack: 主字符串; needle: 子字符串✅strspn(s, accept)匹配前缀字符accept: 允许字符集合✅strcspn(s, reject)匹配前缀不含字符reject: 不允许字符集合✅strpbrk(s, accept)查找任意字符首次出现accept: 允许字符集合✅strdup(s)复制字符串s: 要复制的字符串❌strndup(s, n)指定长度复制n: 最多复制字符数❌strerror(errnum)错误码转字符串errnum: 系统错误码✅strtok(str, delim)分割字符串str: 待分割字符串; delim: 分隔符❌strtok_r(str, delim, saveptr)线程安全分割saveptr: 保存状态指针✅strcoll(s1, s2)区域设置下比较s1, s2: 待比较字符串✅strxfrm(dest, src, n)转换为可排序形式dest: 结果缓冲区; src: 原字符串; n: 最大写入长度✅
📌 提示建议:
使用时务必注意边界和空指针问题;推荐使用更安全的替代函数如 strncpy, strncat;在多线程环境中优先使用 _r 版本(如 strtok_r);对字符串操作频繁的项目可考虑使用 C++ 的 std::string 或其他封装库。
研究学习不易,点赞易。 工作生活不易,收藏易,点收藏不迷茫 :)