第三十期内容 ,主要讲解 CAPL 中常用的字符串处理函数。这是为后续编写更复杂的测试脚本做准备,避免在后续用到这些函数时再单独讲解。
CAPL 编程系列教程 - 第三十期:常用内置函数之字符串处理
一、 课程回顾与本期目标
- 回顾: 前面学习了 CAPL 的基础语法、控制流、函数、事件以及文件操作、日志控制等内置函数。
- 本期目标: 学习 CAPL 中用于处理字符串的几个常用内置函数,包括计算长度、拼接字符串和格式化生成字符串。
二、 计算字符串长度
- 背景: CAPL (源于 C) 中字符串是以字符数组形式存储,并以空字符
\0结尾。计算长度时需注意区分字节数和字符数,尤其在处理包含多字节字符(如中文汉字)时。
-
strlen(char str[])- 作用: 计算字符串
str的字节长度 (Byte Length),不包括结尾的空字符\0。 - 返回值: 返回一个
long类型的整数,表示字节数。 - 注意点:
- 对于纯 ASCII 字符串(英文字母、数字、标点),字节数等于字符数。
- 对于包含多字节字符(如 UTF-8 编码的汉字,一个汉字可能占 3 字节;或 GBK 编码占 2 字节)的字符串,
strlen返回的是总字节数,而不是字符个数。
- 示例:
strlen("Hello")返回 5。strlen("OK张三")在教程环境(可能 UTF-8 或 GBK)中返回 8 (O=1, K=1, 张=3/2, 三=3/2)。
- 作用: 计算字符串
-
mbstrlen(char str[])(Multi-Byte String Length)- 作用: 计算字符串
str中实际包含的字符个数 (Character Count),能正确处理多字节字符。 - 返回值: 返回一个
long类型的整数,表示字符数。 - 推荐: 当字符串可能包含非 ASCII 字符(如中文)时,如果需要获取实际字符数量,应使用
mbstrlen。 - 示例:
mbstrlen("Hello")返回 5。mbstrlen("OK张三")返回 4。
- 作用: 计算字符串
三、 拼接字符串
strncat(char dest[], char source[], long n)(String N Concatenate)- 作用: 将源字符串
source的内容追加到目标字符串dest的末尾。 - 参数:
dest: 目标字符数组(必须有足够空间容纳原内容 + 追加内容 +\0)。source: 要追加的源字符串。n: 目标缓冲区dest的总大小(最大容量)。函数会确保拼接后的字符串(包括结尾的\0)不超过这个长度n,防止缓冲区溢出。它不是指要追加多少个字符。
- 返回值: 无 (
void)。结果直接在dest数组中体现。 - 注意点:
n参数是目标缓冲区的总大小,非常重要,用于安全控制。函数会自动计算还能追加多少字符。- 函数会自动在拼接后的字符串末尾添加
\0。 - 如果
dest空间不足以容纳source的全部内容(在不超过n的前提下),source会被截断。
- 示例:
如果Code snippetchar result[50] = "Hello"; // 初始内容,长度 5 // 向 result 末尾追加 ", Every one!" (长度 11) // 拼接后总长 5 + 11 = 16,加上 \0 需要 17 // n 设为 50 (缓冲区大小),足够用 strncat(result, ", Every one!", 50); write("拼接结果: %s", result); // 输出 "Hello, Every one!" write("结果长度: %d", strlen(result)); // 输出 16n设置过小(如 10),则source只能部分追加,result可能会变成 "Hello, Ev" (长度9)。
- 作用: 将源字符串
四、 格式化生成字符串
snprintf(char buffer[], long n, char format[], ...)(String Number Print Formatted)- 作用: 类似于 C 语言的
sprintf或 CAPL 的write函数,但它不直接输出到控制台或文件,而是将按照format字符串和后续参数格式化后的结果写入到指定的字符数组buffer中。 - 参数:
buffer: 目标字符数组,用于存储生成的字符串。n: 目标缓冲区buffer的大小,生成的字符串(包括结尾的\0)不会超过这个长度。format: 格式控制字符串,包含普通文本和占位符(如%d,%f,%s等,用法同write)。...: 可变参数列表,提供与format中占位符对应的值(变量或表达式)。
- 返回值:
- (标准 C 行为) 返回理论上应该写入
buffer的字符数(不包括结尾的\0),无论是否因为缓冲区大小限制而被截断。如果发生错误,返回负值。 - (视频中演示) 视频中将返回值赋给
long n,并观察到其值可能与mbstrlen计算的实际字符数不同(尤其在有中文时,snprintf返回值更倾向于字节数或某种内部计数),因此不建议依赖其返回值精确判断多字节字符个数。重点在于其副作用:将格式化内容写入buffer。
- (标准 C 行为) 返回理论上应该写入
- 主要用途:
- 将多个变量和文本组合成一个完整的字符串,用于后续处理,如:
- 写入文件 (
filePutString)。 - 生成测试报告条目。
- 设置其他系统(如面板)的文本。
- 写入文件 (
- 将多个变量和文本组合成一个完整的字符串,用于后续处理,如:
- 示例:
Code snippet
char buffer[100]; word vehicleSpeed = 80; float temperature = 22.5; long len_written; // 将速度和温度格式化写入 buffer len_written = snprintf(buffer, elcount(buffer), "当前车速为 %d km/h, 车内温度为 %.1f C", vehicleSpeed, temperature); write("生成的字符串: %s", buffer); // 输出: 生成的字符串: 当前车速为 80 km/h, 车内温度为 22.5 C write("snprintf 返回值: %d", len_written); // 返回值可能不等于实际字符数,若包含中文 write("buffer 实际字符数 (mbstrlen): %d", mbstrlen(buffer)); - 与
write的区别:write直接输出到 Write 窗口;snprintf输出到指定的字符数组(内存中)。
- 作用: 类似于 C 语言的
五、 总结与后续
- 本期学习了 CAPL 中四个常用的字符串处理函数:
strlen(字节长度),mbstrlen(字符长度),strncat(安全拼接),snprintf(格式化生成字符串到缓冲区)。 - 这些函数在处理日志、生成报告、与外部系统交互等场景中非常有用。
- 掌握这些基础函数有助于编写更灵活、功能更丰富的 CAPL 脚本。
- 后续将继续学习 CAPL 的其他内置函数或应用。