CAPL 编程系列教程 - 第三十期:常用内置函数之字符串处理

第三十期内容 ,主要讲解 CAPL 中常用的字符串处理函数。这是为后续编写更复杂的测试脚本做准备,避免在后续用到这些函数时再单独讲解。

CAPL 编程系列教程 - 第三十期:常用内置函数之字符串处理

一、 课程回顾与本期目标

  • 回顾: 前面学习了 CAPL 的基础语法、控制流、函数、事件以及文件操作、日志控制等内置函数
  • 本期目标: 学习 CAPL 中用于处理字符串的几个常用内置函数,包括计算长度、拼接字符串和格式化生成字符串。

二、 计算字符串长度

  • 背景: CAPL (源于 C) 中字符串是以字符数组形式存储,并以空字符 \0 结尾。计算长度时需注意区分字节数字符数,尤其在处理包含多字节字符(如中文汉字)时。
  1. 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)。
  2. mbstrlen(char str[]) (Multi-Byte String Length)

    • 作用: 计算字符串 str 中实际包含的字符个数 (Character Count),能正确处理多字节字符。
    • 返回值: 返回一个 long 类型的整数,表示字符数。
    • 推荐: 当字符串可能包含非 ASCII 字符(如中文)时,如果需要获取实际字符数量,应使用 mbstrlen
    • 示例:
      • mbstrlen("Hello") 返回 5。
      • mbstrlen("OK张三") 返回 4。

三、 拼接字符串

  1. 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 snippet
      char 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)); // 输出 16 
      
      如果 n 设置过小(如 10),则 source 只能部分追加,result 可能会变成 "Hello, Ev" (长度9)。

四、 格式化生成字符串

  1. 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
    • 主要用途:
      • 将多个变量和文本组合成一个完整的字符串,用于后续处理,如:
        • 写入文件 (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 输出到指定的字符数组(内存中)。

五、 总结与后续

  • 本期学习了 CAPL 中四个常用的字符串处理函数:strlen (字节长度), mbstrlen (字符长度), strncat (安全拼接), snprintf (格式化生成字符串到缓冲区)。
  • 这些函数在处理日志、生成报告、与外部系统交互等场景中非常有用。
  • 掌握这些基础函数有助于编写更灵活、功能更丰富的 CAPL 脚本。
  • 后续将继续学习 CAPL 的其他内置函数或应用。