CAPL 编程系列教程的第二十九期内容,主要讲解 CAPL 中常用的数据类型转换函数,特别是数字与字符串之间的转换。
CAPL 编程系列教程 - 第二十九期:常用内置函数之数据类型转换
一、 课程回顾与本期目标
- 回顾: 前面学习了 CAPL 的基础语法、控制流、函数、事件以及文件操作、日志控制等内置函数。
- 本期目标: 学习 CAPL 中用于在不同数据类型(主要是整数、浮点数和字符串)之间进行转换的常用内置函数。
- 应用背景: 在自动化测试脚本中,经常需要处理来自文件(通常是文本格式)的数据或将内部计算的数值(整数、浮点数)格式化为字符串用于日志记录、报告生成或文件写入。
二、 将整数转换为字符串
ltoa(long value, char buffer[], int base)(Long to ASCII/String)- 作用: 将一个长整型 (
long) 数字value转换成指定进制 (base) 的字符串,并存储到字符数组buffer中。 - 参数:
value: 要转换的long类型整数。buffer: 目标字符数组,用于存储转换后的字符串(必须有足够空间)。base: 转换的进制 (如 10 代表十进制,16 代表十六进制,2 代表二进制等)。
- 返回值: 无 (
void)。结果直接存储在buffer中。 - 注意点:
- 目标缓冲区
buffer的大小必须足够容纳转换后的字符串以及结尾的空字符\0。如果空间不足,可能导致字符串被截断或产生不可预期的结果。 - 转换成十六进制时,结果不包含
0x前缀,如果需要,需手动添加。
- 目标缓冲区
- 示例:
Code snippet
char rpmStr[20]; long speed = 2000; ltoa(speed, rpmStr, 10); // 按十进制转, rpmStr 变为 "2000" write("转速(DEC): %s", rpmStr); ltoa(speed, rpmStr, 16); // 按十六进制转, rpmStr 变为 "7D0" write("转速(HEX): 0x%s", rpmStr); // 手动加 0x 前缀
- 作用: 将一个长整型 (
三、 将字符串转换为数字
- 背景: 从文件读取或从某些接口获取的数据通常是字符串形式,需要将其转换为数值类型才能进行计算。
-
atol(char str[])(ASCII/String to Long)- 作用: 将表示整数的字符串
str转换成一个long类型的整数。 - 参数:
str: 包含整数表示的字符串。 - 返回值: 返回转换后的
long类型整数。 - 进制:
- 默认按十进制转换。
- 如果字符串以
0x或0X开头,则按十六进制转换。
- 错误处理/特性:
- 如果字符串无法转换为整数(如 "老贾真帅"),返回 0。
- 如果字符串包含数字和非数字字符(如 "28岁零三天"),会从左到右转换遇到的第一个连续数字部分,并忽略后面的非数字部分(返回 28)。
- 如果字符串表示的数字超出了
long类型的范围,会返回该类型的最大值或最小值(具体行为取决于实现,教程演示是返回最大值)。
- 示例:
Code snippet
long speed; speed = atol("118"); // speed = 118 (十进制) write("Speed: %d", speed); speed = atol("0x6F"); // speed = 111 (十六进制 6F) write("Speed: %d", speed); speed = atol("abc"); // speed = 0 write("Speed: %d", speed); speed = atol("123xyz"); // speed = 123 write("Speed: %d", speed);
- 作用: 将表示整数的字符串
-
atodbl(char str[])(ASCII/String to Double)- 作用: 将表示浮点数的字符串
str转换成一个double类型的浮点数。 - 参数:
str: 包含浮点数表示的字符串。 - 返回值: 返回转换后的
double类型浮点数。 - 格式支持:
- 支持标准小数表示法 (如 "16.5")。
- 支持科学计数法 (如 "3.2e3" 或 "3.2E3",表示 3.2 * 10^3)。
- 错误处理: 类似于
atol,如果无法转换,通常返回 0.0。如果部分可转,则转换可转部分。 - 示例:
Code snippet
double temp, rpm; temp = atodbl("16.5"); // temp = 16.5 write("Temp: %.1f", temp); rpm = atodbl("3.2E3"); // rpm = 3200.0 write("RPM: %.1f", rpm);
- 作用: 将表示浮点数的字符串
-
strtol(char str[], long resultVar)(String to Long - CAPL 特有形式)- 作用: 功能与
atol类似,将字符串str转换成long类型整数,但提供了更灵活的控制和错误信息。 - 参数:
str: 要转换的字符串。resultVar: 一个long类型的输出参数 (变量),用于接收转换后的整数结果。(注:这与标准 C 的strtol(str, &endptr, base)不同,CAPL 似乎将结果通过第二个参数返回)。
- 返回值 (
long):- 成功转换时: 返回紧跟在已成功转换的数字部分之后的那个字符在原字符串
str中的索引。 - 特殊返回值:
- 返回 -1: 表示发生了溢出(字符串数值超出
long范围),此时resultVar会被设置为long的最大/最小值。 - 返回 -2: 表示无法进行任何转换(例如,字符串为空,或者内容不是有效数字)。
- 返回 -1: 表示发生了溢出(字符串数值超出
- 成功转换时: 返回紧跟在已成功转换的数字部分之后的那个字符在原字符串
- 解析多个数字: 利用其返回下一个字符索引的特性,可以在循环中反复调用
strtol,并将上一次的返回值作为下一次调用的偏移量(配合字符串指针或子串操作),从而从一个包含多个数字的字符串中逐个提取数字。(注:视频演示中,似乎可以直接在下一次调用时传入上次的返回值作为某种形式的偏移指示,或者通过操作字符串指针实现,具体需参考 CAPL 文档或进一步实验确认精确用法)。 - 示例 (提取多个数字 - 基于视频演示行为理解):
Code snippet
char numStr[] = "125 117"; long speed = 0; // 用于接收结果 long nextIndex = 0; // 用于接收下一个开始的索引/状态 nextIndex = strtol(numStr, speed); // speed = 125, nextIndex = 3 (假设) write("Speed1: %d, Next Index: %d", speed, nextIndex); // 需要从索引 nextIndex 处开始解析,以下为strtol重载函数,加了偏移量nextIndex nextIndex = strtol(numStr, nextIndex,speed) write("Speed1: %d, Next Index: %d", speed, nextIndex);
- 作用: 功能与
-
strtod(char str[], double resultVar)(String to Double - CAPL 特有形式)- 作用: 功能与
atodbl类似,将字符串str转换成double类型浮点数,提供更灵活控制。 - 参数:
str(输入字符串),resultVar(输出参数,double变量,用于接收结果)。 - 返回值 (
long): 含义与strtol类似,返回解析结束后下一个字符的索引,或特殊值表示错误/溢出。 - 通过参数获取结果: 转换后的
double值存储在作为输出参数传入的resultVar变量中。 - 解析多个数字: 同样可以利用返回值作为偏移量,在循环中解析包含多个浮点数的字符串。
- 示例 (提取多个浮点数 - 基于视频演示行为理解):
Code snippet
char tempStr[] = "-3.5 4.2"; double temp = 0.0; // 用于接收结果 long nextIndex = 0; nextIndex = strtod(tempStr, temp); // temp = -3.5, nextIndex = 4 (假设) write("Temp1: %.1f, Next Index: %d", temp, nextIndex); // 同样需要处理偏移量,以下为伪代码 nextIndex = strtod(tempStr,nextIndex, temp); write("Temp1: %.1f, Next Index: %d", temp, nextIndex);
- 作用: 功能与
六、 总结与后续
- 本期学习了 CAPL 中数字与字符串之间相互转换的常用函数。
ltoa: 整数 -> 字符串 (可指定进制)。atol,atodbl: 字符串 -> 整数/浮点数 (简单版本)。strtol,strtod: 字符串 -> 整数/浮点数 (高级版本,支持偏移量和错误检查,可用于解析多个值,但其参数和返回值用法可能与标准 C 有别,需注意 CAPL 文档)。
- 这些函数在处理文件输入输出、协议解析、数据显示等场景中非常实用。
- 对 CAPL 内置函数的学习有助于编写更强大的脚本。