C语言字符串处理:strspn与strcspn函数详解及对比

Elena
Elena
发布时间:2026-10-13 | 6人浏览过
原创

在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 设为包含多种禁止字符如

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表