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: 表示str1和str2在前n个字符内完全相等。- 非零值 (
<0或>0): 表示在前n个字符内不相等。具体值取决于第一个不匹配字符的编码大小关系(通常<0表示str1小于str2,>0表示str1大于str2)。
- 说明:
mb前缀通常表示该函数能正确处理多字节字符(如中文)。使用n参数可以灵活地只比较字符串的起始部分是否匹配。
- CAPL 语法/用法:
2. 查找子串位置 (mbstrstr 和 mbstrstr_off)
- 目的: 在一个字符串中查找指定的子串,并返回其出现的位置(索引)。
- 函数 1:
mbstrstr(Multi-Byte String Search String)- 功能: 查找子串在源字符串中 首次 出现的位置。
- CAPL 语法/用法:
long mbstrstr(char haystack[], char needle[]); - 参数:
haystack[]: 被搜索的源字符串。needle[]: 要查找的目标子串。
- 返回值 (
long):- 返回子串
needle在haystack中首次出现的起始字符的索引(从 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):- 返回子串
needle在haystack中从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 用于比较,mbstrstr 和 mbstrstr_off 用于查找子串位置,以及 mbsubstr_cpy 用于按需提取子串片段的用法。掌握这些函数的参数、行为(特别是返回值和对目标缓冲区的要求)以及它们在解析和处理字符串数据中的组合应用是 CAPL 编程的重要技能。