当前位置: 首页 > news >正文

strspn函数详解

好的,我们来深入浅出地解析一下 C 语言标准库中的 strspn 函数。

1. 函数的概念与用途

想象一下这样一个场景:你有一个字符串,比如 "192.168.1.1",你想知道从开头算起,有多少个字符是属于“数字或点”这个集合的。strspn 函数就是干这个的。

它的名字是 “string span” 的缩写,意思是“字符串跨度”。它的核心用途是:计算一个字符串 str1 中,起始部分连续有多少个字符,完全包含在另一个字符串 str2 所指定的字符集合中。

简单来说,它就是帮你找到第一个不在指定字符集里的字符的位置

  • 典型应用
    • 数据验证:检查一个字符串的开头是否全是合法的字符(例如,数字、字母)。
    • 分割或解析字符串:在处理诸如日期 "2023-11-10"、IP 地址、特定格式的代码时,跳过开头的有效字符序列。
    • 可以看作是 strtok 等更复杂的字符串分割函数的一个基础构建块。

2. 函数的声明和出处

strspn 函数声明在 C 标准库的头文件 <string.h> 中。

#include <string.h>size_t strspn(const char *str1, const char *str2);
  • 出处:它是标准 C 库的一部分,定义在 libc 中。所以在任何符合标准的 C 编译器(如 gcc、clang)环境下都可以使用,编译时无需额外链接特殊库(-lc 是默认的)。

3. 参数的含义及其取值范围

函数有两个参数,都是指向以空字符 '\0' 结尾的 C 字符串的指针。

  1. const char *str1

    • 含义:要被扫描的源字符串。
    • 取值范围:必须是一个有效的 C 字符串地址,或者为 NULL。如果为 NULL,程序会因解引用空指针而导致段错误(Segmentation Fault)
  2. const char *str2

    • 含义:包含允许字符的集合的字符串。这个字符串中的字符顺序无关紧要,函数只关心这个集合里有什么字符。
    • 取值范围:同样,必须是一个有效的 C 字符串地址。如果 str2 是一个空字符串 (""),那么没有任何字符在允许的集合内,函数会返回 0。

4. 返回值含义及其取值范围

  • 返回值类型size_t

    • 这是一个无符号整数类型,用于表示对象的大小或数量。在打印时,通常使用 %zu 格式说明符。
  • 返回值含义
    返回一个 size_t 类型的值,表示 str1 开头连续包含在 str2 字符集中的字符个数

  • 取值范围

    • 成功时:返回值为 0strlen(str1) 之间。
    • 特殊情况:
      • 如果 str1 的第一个字符就不在 str2 中,返回 0
      • 如果 str1 的全部字符都在 str2 中,则返回 str1 的整个长度(即 strlen(str1))。

5. 函数使用案例

下面我们通过一个简单的例子来理解它的工作方式。

#include <stdio.h>
#include <string.h>int main() {const char *str1 = "129th";const char *str2 = "1234567890";size_t length = strspn(str1, str2);printf("The initial number is: %zu\n", length);printf("The number part is: ");for(size_t i = 0; i < length; i++) {putchar(str1[i]);}putchar('\n');return 0;
}

代码逻辑

  1. 我们有一个字符串 str1 ("129th"),它开头是数字,后面是字母。
  2. 我们定义了另一个字符串 str2 ("1234567890"),它包含了所有我们认为是有效的字符(即数字)。
  3. 调用 strspn(str1, str2),函数会从 str1 开头开始检查:
    • '1'str2 中吗?是的。
    • '2'str2 中吗?是的。
    • '9'str2 中吗?是的。
    • 't'str2 中吗?不是!
  4. 函数停止扫描,并返回当前匹配到的字符数量 3

6. 编译命令及注意事项

编译命令(无需 Makefile)
使用 gcc 编译上述案例非常简单:

gcc -o strspn_demo strspn_demo.c
  • -o strspn_demo:指定输出的可执行文件名为 strspn_demo
  • strspn_demo.c:是你的源代码文件

注意事项

  1. 空指针问题:务必确保传给 strspn 的两个字符串指针都不是 NULL,否则会导致程序崩溃。
  2. 字符集顺序str2 中字符的顺序不影响结果,"abc""cba" 定义的字符集合是完全相同的。
  3. 返回值类型:接收返回值的变量请使用 size_t,打印时使用 %zu,以保证跨平台兼容性。
  4. 理解边界:这个函数只检查起始部分,一旦遇到不在集合中的字符就立即停止。如果你想查找字符串中任意位置的字符集合,则需要使用其他方法(如循环调用 strchr)。

7. 使用案例的结果情况

运行上面编译出的 strspn_demo 程序,输出结果将是:

The initial number is: 3
The number part is: 129

这个结果完美地验证了我们的分析:源字符串 "129th" 的开头有 3 个字符('1', '2', '9')存在于字符集 "1234567890" 中。函数在遇到字母 't' 时停止,并返回计数 3。后续的循环打印出了这前 3 个字符,即 "129"

http://www.dtcms.com/a/343547.html

相关文章:

  • TorchInductor - Introduction
  • 50 C++ STL模板库-算法库 algorithm
  • 使用C++17标准 手写一个vector
  • Python核心技术开发指南(001)——Python简介
  • 基于单片机教室照明灯控制系统
  • 数据结构:生成 (Generating) 一棵 AVL 树
  • 域名污染怎么清洗?域名污染如何处理?
  • 8.21作业
  • 【运维进阶】if 条件语句的知识与实践
  • AI设计师-标小智旗下AI在线设计平台
  • 洛谷 P4942 小凯的数字-普及-
  • Hybrid laser 是什么?
  • BFS算法C++实现(邻接表存储)
  • 最爱--中岛美雪
  • 8 月 20 日科技新动态:多领域创新成果涌现
  • 【typenum】 19 类型相同检查(type_operators.rs片段)
  • Esp32基础(⑩超声波测距模块)
  • Pycharm SSH连接
  • Wireshark数据包波形绘制异常
  • [RestGPT] docs | RestBench评估 | 配置与环境
  • 【51单片机】【protues仿真】基于51单片机16键电子琴系统
  • 【GPT入门】第51课 Conda环境迁移教程:将xxzh环境从默认路径迁移到指定目录
  • OpenAI 开源模型 gpt-oss 是在合成数据上训练的吗?一些合理推测
  • Mysql事务特性
  • python实现根据接口返回数据生成报告和图表
  • (第二十期下)超链接的更多分类
  • 医疗元宇宙:破解医疗困局与数字化变革路径
  • gRPC 服务发现选型对比
  • 基于STM32单片机的二维码识别物联网OneNet云仓库系统
  • 最小生成树的普利姆算法和克鲁斯卡尔算法