CAPL 编程系列教程 - 第三十一期 字符串处理 (Part 2) - 比较、查找与子串提取

CAPL 编程系列教程 - 第三十一期 字符串处理 (Part 2) - 比较、查找与子串提取

目标: 本期继续学习 CAPL 中用于字符串处理的函数,重点介绍 mbstrncmp, mbstrstr, mbstrstr_off, 和 mbsubstr_cpy 这几个(可能支持多字节字符的)函数,用于字符串比较、查找和子串提取。

1. 字符串比较 (mbstrncmp)

  • 目的: 比较两个字符串的内容,最多比较指定的字符数,判断它们是否相等或大小关系。用于替代 CAPL 中不能直接比较字符串内容的 == 运算符。
  • 函数: mbstrncmp (Multi-Byte String N Compare)
    • CAPL 语法/用法: long mbstrncmp(char str1[], char str2[], long n);
    • 参数:
      • str1[], str2[]: 需要进行比较的两个字符数组(字符串)。
      • n: 一个 long 类型整数,指定从字符串开头算起,最多比较多少个字符。
    • 返回值 (long):
      • 0: 表示 str1str2 在前 n 个字符内完全相等。
      • 非零值 (<0>0): 表示在前 n 个字符内不相等。具体值取决于第一个不匹配字符的编码大小关系(通常 <0 表示 str1 小于 str2>0 表示 str1 大于 str2)。
    • 说明: mb 前缀通常表示该函数能正确处理多字节字符(如中文)。使用 n 参数可以灵活地只比较字符串的起始部分是否匹配。

2. 查找子串位置 (mbstrstrmbstrstr_off)

  • 目的: 在一个字符串中查找指定的子串,并返回其出现的位置(索引)。
  • 函数 1: mbstrstr (Multi-Byte String Search String)
    • 功能: 查找子串在源字符串中 首次 出现的位置。
    • CAPL 语法/用法: long mbstrstr(char haystack[], char needle[]);
    • 参数:
      • haystack[]: 被搜索的源字符串。
      • needle[]: 要查找的目标子串。
    • 返回值 (long):
      • 返回子串 needlehaystack 中首次出现的起始字符的索引(从 0 开始)。
      • 如果未找到子串,根据 transcript 描述,返回 -1。
  • 函数 2: mbstrstr_off (Multi-Byte String Search String with Offset)
    • 功能: 从源字符串的指定偏移位置之后开始查找子串,用于查找非首次出现的子串。
    • CAPL 语法/用法 (根据 transcript 推断): long mbstrstr_off(char haystack[], long offset, char needle[]);
    • 参数:
      • haystack[]: 被搜索的源字符串。
      • offset: 一个 long 类型的起始搜索偏移量(索引)。函数会从 haystack[offset] 这个字符开始向后搜索。
      • needle[]: 要查找的目标子串。
    • 返回值 (long):
      • 返回子串 needlehaystack 中从 offset 开始找到的第一个匹配项的起始字符索引(注意:该索引仍然是相对于整个 haystack 字符串的开头计算的)。
      • 如果从 offset 开始未找到子串,返回 -1。
    • 应用: 常用于查找分隔符(如逗号)的第二次、第三次等出现的位置,方法是将上一次找到的索引加 1 作为下一次查找的 offset

3. 提取子字符串 (mbsubstr_cpy)

  • 目的: 从源字符串中提取(复制)指定范围(起始位置和长度)的子串到另一个目标字符数组中。
  • 函数: mbsubstr_cpy (Multi-Byte Substring Copy)
    • 功能: 将源字符串的一部分复制到目标数组。此函数没有返回值 (void),结果直接存储在目标数组中。
    • CAPL 语法/用法 (根据 transcript 推断): void mbsubstr_cpy(char destination[], char source[], long start_index, long length);
    • 参数:
      • destination[]: 目标字符数组,用于存放提取出的子串。必须确保其大小足以容纳 length 个字符加上结尾的 \0
      • source[]: 源字符串。
      • start_index: long 类型,指定从源字符串的哪个索引位置开始提取。
      • length: long 类型,指定要提取的字符数量。
    • 说明:
      • 调用者需要预先分配足够大的 destination 数组。
      • 重要: transcript 未明确说明此函数是否自动添加 \0 终止符。为保险起见,在使用此类函数后,最好手动在 destination[length] 位置添加 \0,以确保结果是一个有效的 C 字符串,除非 CAPL 文档明确保证了自动添加。

4. 实例回顾

  • 本期讲座通过解析一个包含逗号分隔字段的字符串实例,演示了这些函数的组合使用:
    • 使用 mbstrstr 找到第一个逗号的索引 index1
    • 使用 mbstrstr_off(以 index1 + 1 作为 offset)找到第二个逗号的索引 index2
    • 使用 mbsubstr_cpy 提取第一个逗号之前的部分(start_index=0, length=index1)到 title 数组。
    • 使用 mbsubstr_cpy 提取两个逗号之间的部分(start_index=index1 + 1, length=index2 - (index1 +1),注意长度计算的调整)到 value1 数组。
    • 使用 mbsubstr_cpy 提取第二个逗号之后的部分(start_index=index2 + 1, length 通mbstrlen(source)-(index2+1))到 value2 数组。
    • (实例中还讨论了长度计算可能需要 -1 调整的细节,以避免包含分隔符本身)。

总结: 本期重点介绍了 CAPL 中(可能支持多字节的)mbstrncmp 用于比较,mbstrstrmbstrstr_off 用于查找子串位置,以及 mbsubstr_cpy 用于按需提取子串片段的用法。掌握这些函数的参数、行为(特别是返回值和对目标缓冲区的要求)以及它们在解析和处理字符串数据中的组合应用是 CAPL 编程的重要技能。