目录
1. strcspn 函数
2. strspn 函数
3. strchr 函数
4. strstr 函数
5.总结
6.strtok
6.2. 工作原理
7. isdigit 函数
8. isalpha 函数
9. isupper 函数
10. islower 函数
11. isalnum 函数
12. isspace 函数
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() | 标点符号 | .,!?;:等 | 文本清理 |