目录
[1. strcspn 函数](#1. strcspn 函数)
[2. strspn 函数](#2. strspn 函数)
[3. strchr 函数](#3. strchr 函数)
[4. strstr 函数](#4. strstr 函数)
5.总结
6.strtok
[6.2. 工作原理](#6.2. 工作原理)
[7. isdigit 函数](#7. isdigit 函数)
[8. isalpha 函数](#8. isalpha 函数)
[9. isupper 函数](#9. isupper 函数)
[10. islower 函数](#10. islower 函数)
[11. isalnum 函数](#11. isalnum 函数)
[12. isspace 函数](#12. isspace 函数)
[13. ispunct 函数](#13. ispunct 函数)
14.总结
1. strcspn 函数
| 项目 |
说明 |
| 函数原型 |
size_t strcspn(const char *str1, const char *str2); |
| 头文件 |
<string.h> |
| 功能 |
计算字符串 str1 开头连续有几个字符不在 字符串 str2 中 |
| 返回值 |
第一个在 str2 中出现的字符在 str1 中的索引位置 |
| 名称含义 |
String Complement Span(字符串补集跨度) |
| 参数 |
描述 |
str1 |
要扫描的字符串 |
str2 |
包含要匹配字符的字符串 |
| 示例代码 |
输出结果 |
strcspn("abc123", "123") |
3 |
strcspn("hello world", " ") |
5 |
strcspn("password", "!@#") |
8(直到结束都没找到) |
strcspn("123abc", "abc") |
0(第一个字符就在set中) |
| 应用场景 |
示例 |
| 去除换行符 |
buffer[strcspn(buffer, "\n")] = '\0'; |
| 查找分隔符 |
int pos = strcspn(path, "/\\"); |
| 验证非法字符 |
if (strcspn(input, illegal) < strlen(input)) |
2. strspn 函数
| 项目 |
说明 |
| 函数原型 |
size_t strspn(const char *str1, const char *str2); |
| 头文件 |
<string.h> |
| 功能 |
计算字符串 str1 开头连续有几个字符都 在字符串 str2 中 |
| 返回值 |
开头连续匹配字符的数量 |
| 名称含义 |
String Span(字符串跨度) |
| 参数 |
描述 |
str1 |
要扫描的字符串 |
str2 |
包含允许字符的字符串 |
| 示例代码 |
输出结果 |
strspn("abc123", "abc") |
3 |
strspn("111222", "12") |
6 |
strspn("hello", "abcdefghijklmnop") |
5 |
strspn("123abc", "123") |
3 |
| 应用场景 |
示例 |
| 统计前导数字 |
int len = strspn(str, "0123456789"); |
| 验证数字输入 |
if (strspn(input, "0123456789") == strlen(input)) |
| 跳过空白符 |
int pos = strspn(str, " \t\n"); |
3. strchr 函数
| 项目 |
说明 |
| 函数原型 |
char *strchr(const char *str, int c); |
| 头文件 |
<string.h> |
| 功能 |
在字符串中查找第一次出现的指定字符 |
| 返回值 |
指向第一次出现字符的指针,未找到返回 NULL |
| 名称含义 |
String Character(字符串中的字符) |
| 参数 |
描述 |
str |
要扫描的字符串 |
c |
要查找的字符(以 int 形式传递,会被转换为 char) |
| 示例代码 |
输出结果 |
strchr("hello", 'l') |
指向 "llo" 的指针 |
strchr("hello", 'x') |
NULL |
strchr("abcabc", 'a') |
指向第一个 "abcabc" 的指针 |
| 应用场景 |
示例 |
| 查找字符位置 |
char *p = strchr(str, '@'); |
| 截取子串 |
printf("%s", strchr(str, '.')); |
| 统计字符出现次数 |
while((p = strchr(p+1, ch)) != NULL) count++; |
| 进阶用法 |
说明 |
strrchr(str, c) |
从右侧开始查找(最后一次出现) |
4. strstr 函数
| 项目 |
说明 |
| 函数原型 |
char *strstr(const char *haystack, const char *needle); |
| 头文件 |
<string.h> |
| 功能 |
在字符串中查找第一次出现的子字符串 |
| 返回值 |
指向第一次出现子串的指针,未找到返回 NULL |
| 名称含义 |
String String(字符串中的字符串) |
| 参数 |
描述 |
haystack |
要被搜索的主字符串 |
needle |
要搜索的子字符串 |
| 示例代码 |
输出结果 |
strstr("hello world", "world") |
指向 "world" 的指针 |
strstr("abcabc", "ca") |
NULL(找不到) |
strstr("123123", "23") |
指向第一个 "23123" 的指针 |
| 应用场景 |
示例 |
| 查找关键词 |
if (strstr(text, "error") != NULL) |
| 提取文件扩展名 |
char *ext = strstr(filename, ".txt"); |
| 字符串替换 |
结合其他函数实现替换功能 |
| 注意事项 |
说明 |
| 空子串 |
如果 needle 为空字符串,返回 haystack |
| 大小写敏感 |
区分大小写,如需忽略大小写用 strcasestr()(非标准) |
5.总结
| 函数 |
查找目标 |
返回类型 |
返回内容 |
示例 |
结果 |
| strcspn |
字符集 |
size_t |
第一个匹配字符的位置 |
strcspn("abc123","123") |
3 |
| strspn |
字符集 |
size_t |
开头连续匹配的数量 |
strspn("abc123","abc") |
3 |
| strchr |
单个字符 |
char* |
指向该字符的指针 |
strchr("hello",'l') |
"llo" |
| strstr |
子字符串 |
char* |
指向子串的指针 |
strstr("hello","ll") |
"llo" |
6.strtok
令牌(Token) 是指被分割符分隔开的、具有独立意义的字符串片段
| 项目 |
说明 |
| 函数原型 |
char *strtok(char *str, const char *delim); |
| 头文件 |
<string.h> |
| 功能 |
将字符串分割成一系列令牌(token) |
| 返回值 |
指向下一个令牌的指针,如果没有更多令牌则返回 NULL |
| 名称含义 |
String Token(字符串令牌) |
| 参数 |
描述 |
str |
要分割的字符串(第一次调用时传入),后续调用传入 NULL |
delim |
分隔符集合(包含所有可能的分隔字符) |
6.2. 工作原理
| 步骤 |
说明 |
示例 |
| 第一次调用 |
传入要分割的字符串,函数找到第一个分隔符,将其替换为 \0,返回指向字符串开头的指针 |
strtok(str, ",") |
| 后续调用 |
传入 NULL,函数从上次保存的位置继续查找下一个令牌 |
strtok(NULL, ",") |
| 结束条件 |
当没有更多令牌时,返回 NULL |
循环结束 |
复制代码
#include <stdio.h>
#include <string.h>
int main() {
// 1. 定义一个要分割的字符串
char str[] = "apple-banana-orange";
// 2. 使用strtok分割(以"-"为分隔符)
char *token = strtok(str, "-");
// 3. 循环打印所有令牌
while (token != NULL) {
printf("%s\n", token); // 打印当前令牌
token = strtok(NULL, "-"); // 获取下一个令牌
}
return 0;
}
/* 输出:
apple
banana
orange
*/
7. isdigit 函数
| 项目 |
说明 |
| 函数原型 |
int isdigit(int c); |
| 头文件 |
<cctype> (C++) 或 <ctype.h> (C) |
| 功能 |
检查字符是否为十进制数字 |
| 返回值 |
如果是数字(0-9)返回非零值,否则返回0 |
| 名称含义 |
Integer DIGIT(整数数字) |
| 输入字符 |
返回值 |
说明 |
'0' - '9' |
非零值(通常为1) |
所有数字字符 |
'A' |
0 |
字母不是数字 |
' ' |
0 |
空格不是数字 |
'\n' |
0 |
换行符不是数字 |
'$' |
0 |
特殊符号不是数字 |
| 应用场景 |
示例 |
| 验证数字输入 |
if (!isdigit(c)) return false; |
| 提取字符串中的数字 |
if (isdigit(str[i])) num = num * 10 + (str[i] - '0'); |
| 解析用户输入 |
检查输入是否全为数字 |
8. isalpha 函数
| 项目 |
说明 |
| 函数原型 |
int isalpha(int c); |
| 头文件 |
<cctype> (C++) 或 <ctype.h> (C) |
| 功能 |
检查字符是否为字母 |
| 返回值 |
如果是字母(A-Z或a-z)返回非零值,否则返回0 |
| 名称含义 |
ALPHAbet(字母表) |
| 输入字符 |
返回值 |
说明 |
'A' - 'Z' |
非零值 |
大写字母 |
'a' - 'z' |
非零值 |
小写字母 |
'0' |
0 |
数字不是字母 |
' ' |
0 |
空格不是字母 |
'?' |
0 |
符号不是字母 |
| 应用场景 |
示例 |
| 验证姓名输入 |
if (!isalpha(name[i])) 错误提示 |
| 统计文本中的字母数 |
if (isalpha(text[i])) letterCount++; |
| 过滤非字母字符 |
只保留字母用于进一步处理 |
9. isupper 函数
| 项目 |
说明 |
| 函数原型 |
int isupper(int c); |
| 头文件 |
<cctype> (C++) 或 <ctype.h> (C) |
| 功能 |
检查字符是否为大写字母 |
| 返回值 |
如果是大写字母(A-Z)返回非零值,否则返回0 |
| 名称含义 |
UPPER case(大写) |
| 输入字符 |
返回值 |
说明 |
'A' - 'Z' |
非零值 |
大写字母 |
'a' - 'z' |
0 |
小写字母不是大写 |
'0' |
0 |
数字不是字母 |
' ' |
0 |
空格不是字母 |
| 应用场景 |
示例 |
| 检查密码复杂性 |
if (isupper(pwd[i])) hasUpper = true; |
| 转换大小写 |
tolower(c) 常与 isupper 配合使用 |
| 统计大写字母 |
分析文本中大写字母的出现频率 |
10. islower 函数
| 项目 |
说明 |
| 函数原型 |
int islower(int c); |
| 头文件 |
<cctype> (C++) 或 <ctype.h> (C) |
| 功能 |
检查字符是否为小写字母 |
| 返回值 |
如果是小写字母(a-z)返回非零值,否则返回0 |
| 名称含义 |
LOWER case(小写) |
| 输入字符 |
返回值 |
说明 |
'a' - 'z' |
非零值 |
小写字母 |
'A' - 'Z' |
0 |
大写字母不是小写 |
'0' |
0 |
数字不是字母 |
' ' |
0 |
空格不是字母 |
| 应用场景 |
示例 |
| 检查密码复杂性 |
if (islower(pwd[i])) hasLower = true; |
| 转换大小写 |
toupper(c) 常与 islower 配合使用 |
| 统计小写字母 |
分析文本中小写字母的出现频率 |
11. isalnum 函数
| 项目 |
说明 |
| 函数原型 |
int isalnum(int c); |
| 头文件 |
<cctype> (C++) 或 <ctype.h> (C) |
| 功能 |
检查字符是否为字母或数字 |
| 返回值 |
如果是字母(A-Z,a-z)或数字(0-9)返回非零值,否则返回0 |
| 名称含义 |
ALpha NUMeric(字母数字) |
| 输入字符 |
返回值 |
说明 |
'A' - 'Z' |
非零值 |
大写字母 |
'a' - 'z' |
非零值 |
小写字母 |
'0' - '9' |
非零值 |
数字 |
' ' |
0 |
空格不是字母数字 |
'@' |
0 |
符号不是字母数字 |
| 应用场景 |
示例 |
| 过滤特殊字符 |
只保留字母和数字用于用户名验证 |
| 字符串清理 |
移除标点符号和空格 |
| 分词处理 |
识别单词和数字的边界 |
12. isspace 函数
| 项目 |
说明 |
| 函数原型 |
int isspace(int c); |
| 头文件 |
<cctype> (C++) 或 <ctype.h> (C) |
| 功能 |
检查字符是否为空白字符 |
| 返回值 |
如果是空白字符返回非零值,否则返回0 |
| 名称含义 |
SPACE(空格) |
| 空白字符 |
ASCII值 |
说明 |
' ' |
32 |
空格 |
'\t' |
9 |
水平制表符 |
'\n' |
10 |
换行 |
'\v' |
11 |
垂直制表符 |
'\f' |
12 |
换页 |
'\r' |
13 |
回车 |
| 应用场景 |
示例 |
| 去除字符串首尾空白 |
配合指针移动跳过空白 |
| 单词计数 |
根据空白符分割单词 |
| 格式化解析 |
跳过空格和制表符 |
13. ispunct 函数
| 项目 |
说明 |
| 函数原型 |
int ispunct(int c); |
| 头文件 |
<cctype> (C++) 或 <ctype.h> (C) |
| 功能 |
检查字符是否为标点符号 |
| 返回值 |
如果是标点符号返回非零值,否则返回0 |
| 名称含义 |
PUNCTuation(标点) |
| 标点符号示例 |
说明 |
.!?,';: |
句号、感叹号、问号、逗号等 |
-()[]{} |
括号、破折号等 |
@#$%^&* |
特殊符号 |
+/<=> |
运算符符号 |
| 应用场景 |
示例 |
| 移除标点符号 |
if (!ispunct(c)) 保留字符 |
| 文本分析 |
统计文章中标点符号的使用频率 |
| 语法检查 |
识别句子结束符 |
14.总结
| 函数 |
检查内容 |
返回真时的字符 |
常见应用 |
isdigit() |
数字 |
0-9 |
验证数字输入 |
isalpha() |
字母 |
A-Z, a-z |
验证文本输入 |
isupper() |
大写字母 |
A-Z |
密码复杂度检查 |
islower() |
小写字母 |
a-z |
密码复杂度检查 |
isalnum() |
字母或数字 |
A-Z, a-z, 0-9 |
过滤特殊字符 |
isspace() |
空白字符 |
空格、制表符、换行等 |
单词分割 |
ispunct() |
标点符号 |
.,!?;:等 |
文本清理 |