C语言字符串相关函数(strcspn、strspn、strchr、strstr、strtok、isXXX)

目录

[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() 标点符号 .,!?;: 文本清理
相关推荐
Trouvaille ~2 年前
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
c语言·开发语言·gets·puts·字符串函数·内存函数·字符函数
Elnaij2 年前
大归纳!!教你使用<string.h>的字符函数与字符串函数!!☑
c语言·开发语言·字符串函数·字符函数·string.h
加油,旭杏2 年前
【MySQL】内置函数
数据库·mysql·字符串函数·内置函数·日期函数·数学函数·其他函数
todoitbo2 年前
MySQL魔法秀:揭秘常用字符串函数的神奇操作
数据库·mysql·字符串函数
炫酷的伊莉娜2 年前
【MySQL】内置函数 -- 详解
数据库·mysql·字符串函数·日期函数·数学函数·其它函数
little_fat_sheep2 年前
【Kotlin】Kotlin基本数据类型
kotlin·基本数据类型·字符串函数·运算符
椿融雪2 年前
【MySQL】MySQL内置函数--日期函数/字符串函数/数学函数/其他相关函数
mysql·字符串函数·内置函数·日期函数·数学函数·password·ifnull
下课后泡实验室2 年前
【C语言 模拟实现strcmp函数】
c语言·开发语言·笔记·字符串函数·strcmp·字符串比较大小·模拟实现strcmp函数
下课后泡实验室2 年前
【C语言 模拟实现strcat函数】
c语言·开发语言·笔记·字符串函数·strcat·字符串追加·模拟实现strcat