百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

C语言strcspn函数详解:字符串的“扫雷探测器”

liebian365 2025-03-19 14:04 3 浏览 0 评论

strcspn 是C语言标准库中的一个函数,定义在 头文件中。它用于计算从字符串的开始到首次出现任何属于指定字符集合的字符之间的字符数量。换句话说,strcspn 计算的是主字符串中不包含指定字符集合的初始段长度。


函数原型

size_t strcspn(const char *str, const char *reject);

功能
像扫雷一样扫描字符串str,返回开头连续不包含reject集合中任意字符的字符数量,遇到第一个“地雷”(禁止字符)时停止。


入口参数:扫雷规则

  1. str - 主字符串(雷区)
  • 类型:const char*
  • 必须是以\0结尾的有效字符串
  • 示例:"user@domain.com"(需要检测@前的内容)
  1. reject - 禁止字符集合(地雷列表)
  • 类型:const char*
  • 可包含多个特殊字符,如"@:/"
  • 示例:"@"(将@视为地雷)

返回参数:扫雷报告

  • 返回值:安全区域的连续字符数量
size_t safe_len = strcspn("hello#world", "#"); // 返回5("hello"不包含#)
  • 极端情况
    • 若第一个字符就是“地雷”,返回0
    • 若整个字符串无“地雷”,返回字符串长度

实战用法:三大扫雷场景

场景1:提取安全子串(拆弹专家)

char url[] = "https://domain.com/path";
size_t protocol_end = strcspn(url, ":/"); // 查找协议结束位置

printf("协议类型:%.*s\n", (int)protocol_end, url); 
// 输出:https(遇到:停止)
printf("剩余部分:%s\n", url + protocol_end); 
// 输出://domain.com/path

场景2:命令行参数解析(危险符号过滤)

char cmd[] = "rm -rf ./tmp#危险操作";
size_t safe_len = strcspn(cmd, "#!$"); // 检测危险符号

if (safe_len != strlen(cmd)) {
    printf("发现危险符号 '%c' 在位置 %zu\n", 
           cmd[safe_len], safe_len);
    // 输出:发现危险符号 '#' 在位置 11
}

场景3:分割键值对(安全隔离带)

char config[] = "timeout=300;retry=5";
size_t eq_pos = strcspn(config, "=;"); // 找等号或分号

if (config[eq_pos] == '=') {
    printf("键:%.*s\n", (int)eq_pos, config);     // 输出:timeout
    printf("值:%s\n", config + eq_pos + 1);      // 输出:300;retry=5
}

高阶技巧:扫雷兵手册

  1. 多雷区探测(组合危险字符)
char input[] = "datavalue";
size_t safe_len = strcspn(input, "<>"); // 检测HTML标签符号
printf("安全文本:%.*s\n", (int)safe_len, input); // 输出:data
  1. 反向扫雷(配合strspn使用)
char text[] = "123abc456";
// 先找数字区域,再找非数字区域
size_t num_len = strspn(text, "0123456789");      // 3
size_t non_num_len = strcspn(text + num_len, "0123456789"); // 3
printf("字母段:%.*s\n", (int)non_num_len, text + num_len); // abc
  1. 动态生成雷区(灵活防御)
char forbidden_chars[256] = {0};
// 添加控制字符到雷区
for (int i = 0; i < 32; i++) {
    forbidden_chars[i] = 1;
}
size_t safe_len = strcspn(input, forbidden_chars); // 过滤不可见字符

注意事项:扫雷禁区

  1. 区分大小写
size_t len = strcspn("Hello", "H"); // 返回0(H是地雷)
  1. 空雷区陷阱
size_t len = strcspn("test", ""); // 返回4(无地雷时扫描整个字符串)
  1. Unicode字符问题
char str[] = "中文test";
size_t len = strcspn(str, ""); 
// 可能返回错误值(需用宽字符函数)

手写strcspn:理解探测逻辑

size_t my_strcspn(const char *str, const char *reject) {
    size_t count = 0;
    while (*str) {
        // 检查当前字符是否在地雷列表
        const char *r = reject;
        while (*r) {
            if (*str == *r) return count;
            r++;
        }
        count++;
        str++;
    }
    return count; // 全程无地雷
}

对比表格:选择排雷工具

特性

strcspn

strchr

strspn

检测目标

多个禁止字符中的任意一个

单个特定字符

多个允许字符中的全部

返回条件

遇到第一个禁止字符停止

找到指定字符停止

遇到第一个非允许字符停止

典型应用

查找分隔符、过滤危险字符

定位特定符号

验证前缀合法性

时间复杂度

O(n*m)(n=主串长度, m=雷区长度)

O(n)

O(n*m)


通过这个“字符串扫雷指南”,你可以精准定位危险字符的位置,安全处理字符串数据!下次需要过滤特殊符号时,记得启动你的扫雷探测器!

相关推荐

python如何对字符串进行操作(python如何对字符串进行操作输出)

1.字符串的创建可通过直接赋值、构造或转义字符来创建字符串。#普通字符串s="Hello,World!"#多行字符串(使用三引号)multi_line_str='''Thisi...

Excel表格中11个常用的字符串函数

今天和大家聊聊常用的字符串函数,在不同的条件下,如何选择字符串函数很关键。下面我为大家列举了11个关于字符串的函数公式。一、EXACT(两个字符串进行结果比较)比较两个字符串是否完全相同(这里是要区分...

详细介绍一下Python中如何对字符串进行操作?

在Python中,字符串做为一种常见的数据处理类型,几乎在每个应用程序中都会被用到。而作为Python中使用最广泛的数据类型Python也是提供了很多强大的方法来支持对于字符串的处理操作。下面我们就来...

Java中你知道几种从字符串中找指定的字符的数量

遇到这样的问题,常规的思路估计就是遍历String,然后逐个对比。下面先看循环遍历循环遍历privatestaticintgetNum(StringoriginStr,Stringtarg...

C语言strcspn函数详解:字符串的“扫雷探测器”

strcspn是C语言标准库中的一个函数,定义在头文件中。它用于计算从字符串的开始到首次出现任何属于指定字符集合的字符之间的字符数量。换句话说,strcspn计算的是主字符串中不包含指定字符集...

如何使用 Python 的 f-string 进行字符串格式化

Python中的字符串格式化曾经有点麻烦。必须在...

java判断字符串中是否包含某个字符

1使用String类的contains()方法contains()方法用于判断字符串中是否包含指定的字符或字符串。语法如下:publicbooleancontains(CharSequence...

Python基础:f-string不同数据类型的格式化选项,终极指南!

上一篇文章我们介绍了4种字符串格式化方法,其中最现代、最直观的方式是f-string,从Python3.6开始引入,而且时不时就增加一些超级优雅的小改进。今天,钢铁老豆想要继续给大家展开介绍不同数据...

Excel查找指定字符串,返回相应的结果

通过下面的函数,可以实现查找指定字符串,若找到返回“有”,若找不到返回“无”。=IF(ISNUMBER(SEARCH("失业",G3)),"有","无")...

一个list中,有b.a.b.c.b.b.写个方法去掉所有b

importjava.util.ArrayList;importjava.util.List;publicclassRemoveBFromStringList{/**...

掌握Python f-string(掌握催眠能力之后的日常生活)

f-string,通常称为格式化字符串文本,是Python3.6中添加的一项强大功能,它提供了一种将表达式包含在字符串文本中的清晰实用的方法。,...

深入了解字符串:定义、转义字符和字符串下标

字符串是编程中常见的数据类型之一,用于表示文本信息。在绝大多数编程语言中,字符串都是由一系列字符组成的序列,可以包含字母、数字、符号以及空格等。字符串的定义:...

100个Java工具类之70:字符串处理工具类StringUtils

StringUtils是常用的工具类,提供大量处理字符串的静态方法。StringUtils主要特点...

Shell中针对字符串的切片,截取,替换,删除,大小写操作

切片返回字符串变量var的长度...

Sqlite - 常规函数 - RTRIM(sqlite命令行工具)

在SQLite中,RTRIM函数是一个用于处理字符串的函数,其主要作用是移除字符串右侧(尾部)的指定字符。如果不指定要移除的字符,默认会移除字符串右侧的空格字符。以下是对RTRIM函数的详细...

取消回复欢迎 发表评论: