C语言字符串处理:strspn与strcspn函数详解及对比
在C语言编程中,字符串的高效处理离不开标准库的支持。`strspn`和`strcspn`是两个常被忽视但极具实用价值的工具函数。它们分别负责计算字符串前缀中与目标集合“匹配”和“不匹配”的字符数量,常用于剥离文件扩展名、定位特殊符号位置或校验字符合法性。
核心逻辑与原理
这两个函数均定义在 #include <string.h> 头文件中,原型如下:
- strspn:
size_t strspn(const char *str, const char *accept); - strcspn:
size_t strcspn(const char *str, const char *reject);
两者的核心区别在于对字符集合的判断方向:
- strspn 从左往右扫描 str,统计连续出现的、且所有字符都存在于 accept 集合中的数量。
- strcspn 从左往右扫描 str,统计连续出现的、且所有字符都不存在于 reject 集合中的数量(换句话说,它返回的是 str 中第一个出现在 reject 里的字符的位置索引)。
实战案例一:使用strspn提取数字前缀
在处理混合文本时,经常需要截取前面的数字部分。例如从 "129th" 中提取有效数字位数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
int i;
char str[] = "129th";
char accept[] = "0123456789";
// 计算str开头有多少个字符属于accept
i = strspn(str, accept);
printf("str 前 %d 个字符都属于数字\n", i);
system("pause");
return 0;
}
执行结果:
str 前 3 个字符都属于数字
此例中,函数发现 '1', '2', '9' 均在数字集合中,遇到 't' 停止,故返回 3。
实战案例二:使用strcspn定位分隔符
假设需要从一段 URL 地址中截取出域名部分,或者寻找特定字符在字符串中的首次出现位置。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char* s1 = "http://c.biancheng.net/cpp/u/biaozhunku/";
char* s2 = "/"; // 设定斜杠为拒绝出现的字符集
// 计算s1开头有多少个字符不是'/'
// 实际上就是找到第一个'/'的位置
int n = strcspn(s1, s2);
if (n < strlen(s1)) {
printf("在s1中找到第一个%s位于索引: %d\n", s2, n);
} else {
printf("未找到目标字符\n");
}
system("pause");
return 0;
}
若将案例中的 s2 设为包含多种禁止字符如
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













