字符串函数
本文介绍了C语言中常用的字符分类函数和字符串处理函数。字符分类函数包括isalpha()、isdigit()、isalnum()等9个函数,用于判断字符类型;字符串函数包括strlen()、strcpy()、strcat()、strcmp()等7个核心函数及其安全版本(如strncpy()、strncat()),涵盖字符串长度计算、复制、连接、比较等操作。每个函数都提供了原型说明、功能描述、使用示
字符分类函数
9个字符分类函数:
1.检查字母字符
isalpha(int c)
判断字符是否为字母(A-Z或a-z)。
示例:
char ch = 'A';
if (isalpha(ch)) {
printf("%c 是字母\n", ch);
}
2.检查数字字符
isdigit(int c)
判断字符是否为数字(0-9)。
示例:
char ch = '5';
if (isdigit(ch)) {
printf("%c 是数字\n", ch);
}
3.检查字母或数字字符
isalnum(int c)
判断字符是否为字母或数字(等价于 isalpha(c) || isdigit(c))。
示例:
char ch = 'a';
if (isalnum(ch)) {
printf("%c 是字母或数字\n", ch);
}
4.检查空白字符
isspace(int c)
判断字符是否为空白字符(空格、制表符 \t、换行符 \n 等)。
示例:
char ch = ' ';
if (isspace(ch)) {
printf("字符是空白符\n");
}
5.检查可打印字符
isprint(int c)
判断字符是否为可打印字符(ASCII 32-126,不包括控制字符)。
示例:
char ch = '#';
if (isprint(ch)) {
printf("%c 是可打印字符\n", ch);
}
6.检查控制字符
iscntrl(int c)
判断字符是否为控制字符(ASCII 0-31及127)。
示例:
char ch = '\n';
if (iscntrl(ch)) {
printf("字符是控制字符\n");
}
7.检查小写字母
islower(int c)
判断字符是否为小写字母(a-z)。
示例:
char ch = 'Z';
if (isupper(ch)) {
printf("%c 是大写字母\n", ch);
}
8.检查标点符号
ispunct(int c)
判断字符是否为标点符号(非字母、数字、空白符的可打印字符)。
示例:
char ch = '!';
if (ispunct(ch)) {
printf("%c 是标点符号\n", ch);
}
9.检查十六进制数字字符
isxdigit(int c)
判断字符是否为十六进制数字(0-9、A-F、a-f)。
示例:
char ch = 'F';
if (isxdigit(ch)) {
printf("%c 是十六进制数字\n", ch);
}
注意事项
- 参数类型:字符分类函数的参数是
int类型,但通常直接传入char类型会自动转换。 - EOF处理:传递
EOF(通常为-1)给这些函数会导致未定义行为。 - 区域设置:某些函数(如
isalpha)的结果可能受区域设置(locale)影响。
字符串函数
1.strlen函数
strlen是C语言标准库中的一个函数,用于计算字符串的长度(不包括结尾的空字符'\0')。该函数定义在头文件<string.h>中,其返回值是size_t类型的。
size_t strlen(const char *str);
- 参数:
str是指向以空字符结尾的字符串的指针。 - 返回值:返回字符串的长度,类型为
size_t(无符号整数)。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
size_t length = strlen(str);
printf("Length of the string: %zu\n", length);
return 0;
}
注意事项
- 字符串必须以空字符
'\0'结尾,否则strlen的行为是未定义的。 - 如果传入空指针(
NULL),程序可能会崩溃或产生不可预测的行为。
手动实现strlen函数:
第一种方法:

第二种方法:

strnlen函数概述
strnlen是C标准库中的字符串操作函数,用于计算字符串的长度,但限制在指定的最大长度范围内。与strlen不同,strnlen通过参数显式指定最大检查长度,避免潜在的缓冲区溢出风险。
size_t strnlen(const char *s, size_t maxlen);
- 参数:
s:待计算长度的字符串(需以\0结尾)。maxlen:最大检查长度,函数不会检查超过此长度的字符。
- 返回值:
- 返回字符串的实际长度(不包括
\0),若未找到\0且在maxlen范围内,则返回maxlen。
- 返回字符串的实际长度(不包括
使用场景
- 安全边界检查:处理可能未终止的字符串时(如用户输入),避免
strlen的越界访问。 - 固定缓冲区处理:已知字符串最大长度时(如网络协议字段),限制检查范围。
ps 简单理解就是在strlen的基础之上有了一个参数的限制,可以计算指定范围之内的字符串长度
2.strcpy函数
strcpy 是 C 语言标准库函数,用于将一个字符串复制到另一个字符串中。其函数原型为:
char *strcpy(char *dest, const char *src);
dest:目标字符串的指针,需确保有足够的空间容纳源字符串(包括终止符\0)。src:源字符串的指针,必须以\0结尾。
示例代码
#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;
}
输出结果:
Copied string: Hello, World!
注意事项
1.目标缓冲区大小:必须确保 dest 的长度足够容纳 src 的内容,否则会导致缓冲区溢出。
char dest[5];
strcpy(dest, "Overflow"); // 错误:dest 空间不足
2.安全性问题:strcpy 不会检查目标缓冲区大小,推荐使用 strncpy 或非标准函数如 strlcpy(部分平台支持)。
strncpy(dest, src, sizeof(dest) - 1);
dest[sizeof(dest) - 1] = '\0'; // 手动添加终止符
3.重叠内存:若 src 和 dest 内存重叠,行为未定义,应使用 memmove 代替。(memmove函数会在下一篇文章继续讲解)
手动实现strcpy函数:

strncpy函数
strncpy 是 C 标准库中的字符串操作函数,用于将指定长度的字符从源字符串复制到目标字符串。其函数原型如下:
char *strncpy(char *dest, const char *src, size_t n);
dest:目标字符串的指针,用于存储复制后的内容。src:源字符串的指针,提供待复制的字符。n:最多复制的字符数(包括终止符\0)。
功能特点:
strncpy 会从 src 复制最多 n 个字符到 dest。如果 src 的长度小于 n,剩余部分会用 \0 填充;如果 src 的长度大于或等于 n,dest 可能不会以 \0 结尾。
- 复制行为:
- 若
src的前n个字符不含\0,则dest不会以\0结尾。 - 若
src长度小于n,strncpy会在dest中填充\0直到写入总共n个字符。
- 若
示例:
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, World!";
char dest[20];
// 复制前 5 个字符
strncpy(dest, src, 5);
dest[5] = '\0'; // 手动添加终止符
printf("Partial copy: %s\n", dest); // 输出 "Hello"
// 复制整个字符串(包括终止符)
strncpy(dest, src, sizeof(src));
printf("Full copy: %s\n", dest); // 输出 "Hello, World!"
return 0;
}
注意事项:
- 终止符问题:
strncpy不保证目标字符串以\0结尾,需手动处理。 - 缓冲区溢出:目标缓冲区
dest必须至少能容纳n个字符,否则会导致未定义行为。 - 性能与安全:相比
strcpy,strncpy更安全,但可能因填充\0而影响性能。
3.strcat函数
strcat函数的基本概念
strcat是C语言标准库中的一个字符串操作函数,用于将源字符串(source)连接到目标字符串(destination)的末尾。该函数定义在头文件<string.h>中,函数原型如下:
char *strcat(char *dest, const char *src);
- dest:目标字符串,需确保有足够的空间容纳连接后的结果。
- src:源字符串,以空字符(
\0)结尾。 - strcat会从
dest字符串的终止空字符(\0)处开始,将src字符串的内容逐个字符复制到dest的末尾,直到遇到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); // 输出: Hello, World!
return 0;
}
注意事项:
- 目标字符串
dest必须预先分配足够的空间,否则可能导致缓冲区溢出(未定义行为)。 dest和src不能重叠,否则结果不可预测。
手动实现strcat函数:

strncat函数
strncat是C语言标准库中的一个字符串操作函数,用于将源字符串的前n个字符追加到目标字符串末尾,并确保目标字符串以空字符(\0)结尾。其原型定义在头文件<string.h>中:
strncat函数相对于strcat函数是增加了一个参数,用来限制两个字符串连接起来的长度,更加的安全,可以避免被连接的字符串空间不够的情况。
char *strncat(char *dest, const char *src, size_t n);
- 从
src的第一个字符开始,逐个复制到dest的末尾(覆盖dest原有的终止符)。 - 若
src的长度小于n,复制全部src内容;否则仅复制前n个字符。 - 最终在结果字符串末尾自动添加终止符
\0。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello";
char src[] = ", World!";
strncat(dest, src, 5); // 追加前5个字符(包括空格和逗号)
printf("%s\n", dest); // 输出:Hello, Wo
return 0;
}
4.strcmp函数
strcmp 是 C 语言标准库中的一个字符串比较函数,位于 <string.h> 头文件中。其功能是按字典序比较两个字符串,返回一个整数表示比较结果。
int strcmp(const char *str1, const char *str2);
- 返回值含义:
- 返回
0:str1和str2内容完全相同。 - 返回正整数:
str1大于str2(按 ASCII 码顺序)。 - 返回负整数:
str1小于str2。
- 返回
示例:
#include <stdio.h>
#include <string.h>
int main() {
char s1[] = "apple";
char s2[] = "banana";
int result = strcmp(s1, s2);
printf("比较结果: %d\n", result); // 输出负值('a' < 'b')
return 0;
}
注意事项:
- 区分大小写:
strcmp是大小写敏感的。若需忽略大小写,可使用strcasecmp(POSIX 标准)或自定义实现。 - 非空终止字符串风险:若字符串未以
\0结尾,可能导致越界访问。 - 性能:时间复杂度为 O(n),需遍历字符串直到发现差异或结束符。
手动实现strcmp函数:

strncmp函数
strncmp 是 C 标准库中的一个字符串比较函数,用于比较两个字符串的前 n 个字符。其原型定义在 <string.h> 头文件中:
int strncmp(const char *str1, const char *str2, size_t n);
参数说明
str1:指向第一个字符串的指针。str2:指向第二个字符串的指针。n:需要比较的最大字符数。
返回值
- 返回值为整数:
- 若
str1和str2的前n个字符完全相同,返回0。 - 若
str1的前n个字符小于str2的前n个字符(按字典序),返回负值。 - 若
str1的前n个字符大于str2的前n个字符(按字典序),返回正值。
- 若
5.strstr函数
strstr是C语言标准库中的一个字符串查找函数,用于在主字符串中查找子字符串的首次出现位置。
char *strstr(const char *haystack, const char *needle);
参数说明:
haystack:主字符串,即被搜索的字符串。needle:子字符串,即要查找的目标字符串。
返回值:
- 如果找到子字符串,返回指向首次出现位置的指针。
- 如果未找到,返回
NULL。
示例:
#include <stdio.h>
#include <string.h>
int main() {
const char *haystack = "Hello, world!";
const char *needle = "world";
char *result = strstr(haystack, needle);
if (result != NULL) {
printf("Found: %s\n", result);
} else {
printf("Not found.\n");
}
return 0;
}
注意事项:
- 如果
needle是空字符串(""),函数会返回haystack的起始地址。 - 区分大小写,如需不区分大小写的查找,需自行实现或使用其他库函数(如
strcasestr,非标准)。 - 使用时需确保字符串以
\0结尾,否则可能导致未定义行为。
手动实现strstr函数:

6.strtok函数
strtok 是 C 语言标准库中的一个字符串分割函数,位于 <string.h> 头文件中。其作用是通过指定的分隔符(delimiters)将字符串拆分为多个子串(token)。
char *strtok(char *str, const char *delimiters);
- str:待分割的字符串(首次调用时传入,后续调用传入
NULL)。 - delimiters:分隔符集合,任意一个字符均会被视为分隔符。
使用说明
- 首次调用:传入待分割字符串和分隔符,返回第一个子串的指针。
- 后续调用:传入
NULL和相同的分隔符,继续返回后续子串。 - 结束条件:当无更多子串时返回
NULL
示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "apple,banana,cherry";
const char *delimiters = ",";
char *token = strtok(str, delimiters);
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, delimiters);
}
return 0;
}
输出:
apple
banana
cherry
注意事项
- 修改原字符串:
strtok会直接修改输入字符串,将分隔符替换为\0。若需保留原字符串,应先复制一份。 - 线程不安全:
strtok使用静态缓冲区,多线程环境下应改用strtok_r(POSIX 标准)。 - 连续分隔符:连续的分隔符会被视为单个分隔符处理。
7.strerror函数
strerror 是 C 标准库(<string.h>)中用于将错误码转换为可读错误信息的函数。其原型如下:
char *strerror(int errnum);
- 参数:
errnum为错误码(通常来自errno或系统调用返回值)。 - 返回值:指向描述错误的静态字符串的指针。
示例:
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {
errno = EACCES; // 模拟权限错误
printf("Error: %s\n", strerror(errno));
return 0;
}
注意事项:
- 线程安全性:
strerror返回的指针指向静态内存,多线程环境中可能不安全。POSIX 提供了线程安全版本strerror_r。 - 不可修改返回值:返回的字符串为只读,修改会导致未定义行为。
- 错误码范围:部分平台可能支持非标准错误码,但跨平台时应使用标准值(如
<errno.h>中的定义)。
更多推荐



所有评论(0)