lr_eval_string   返回脚本中一个参数当前的值

Returns the string argument after evaluating embedded parameters.一般都用在调试脚本时输出参数的值。

lr_save_string   ——Saves a null-terminated string to a parameter.

帮助文档里:

char *lr_eval_string( const char *instring );
 
例子:下面的例子使用lr_eval_string来代替参数row_cnt的当前值。使用lr_output_message把这个值输出到输出窗口。
lrd_stmt(Csr1, "select count(*) from employee", -1, 1 /*Deferred*/, 2 /*Ora V7*/, 0);
 
lrd_bind_col(Csr1, 1, &COUNT_D1, 0, 0);
 
lrd_exec(Csr1, 0, 0, 0, 0, 0);
 
lrd_save_col(Csr1, 1, 1, 0, "row_cnt");
 
lrd_fetch(Csr1, 1, 1, 0, PrintRow2, 0);
lr_output_message("value : %s",  lr_eval_string("The row count is: {row_cnt}"));
lr_log_message(lr_eval_string("{row_cnt}"));
注:lr_eval_string是内部地分配内存。在每一次迭代之后会释放。如果你在循环中给参数赋值,不要使用lr_eval_string保存内存。你需要使用lr_eval_string_ext,并且在每个循环迭代中使用lr_eval_string_ext_free释放内存。
lr_eval_string_ext在关联的数据是二进制数据,例如,数据包含嵌入的NULL字符时是非常有用的。
 
问题:常量参数?
示例代码1:
   const char * data="abcd";
char * data1,data2,data3 ;
lr_message("data value: %s",data);
lr_save_string(data,"data1");
lr_message("data1 value: %s",lr_eval_string("{data1}")); lr_convert_string_encoding(data,LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"data2");
lr_message("data2 value : %s",lr_eval_string("{data2}"));
lr_convert_string_encoding这行时,编译不通过,type error in argument 1 to `lr_convert_string_encoding'; found `pointer to const char' expected `pointer to char' 
修改代码,将data的定义中const去掉,则可直接运行成功。
Starting action Action.
data value: abcd
Action.c(): Notify: Saving Parameter "data1 = abcd".
Action.c(): Notify: Parameter Substitution: parameter "data1" = "abcd"
data1 value: abcd
Action.c(): Notify: Saving Parameter "data2 = abcd\x00".
Action.c(): Notify: Parameter Substitution: parameter "data2" = "abcd\x00"
data2 value : abcd
Ending action Action.

问题来了,那这个data参数就是这样定义的,不能改变呢。如果用lr_eval_string函数,

   const char * data="abcd";
char * data1,data2,data3 ;
lr_message("data value: %s",data);
lr_convert_string_encoding(lr_eval_string("{data}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"data2");
lr_message("data2 value : %s",lr_eval_string("{data2}"));

运行结果有误:

Starting action Action.
data value: abcd
Action.c(): Warning: The string 'data' with parameter delimiters is not a parameter.
Action.c(): Notify: Saving Parameter "data2 = {data}\x00".
Action.c(): Notify: Parameter Substitution: parameter "data2" = "{data}\x00"
data2 value : {data}
Action.c(): Notify: Saving Parameter "data1 = abcd".
Action.c(): Notify: Parameter Substitution: parameter "data1" = "abcd"
data1 value: abcd

将data保存成一个参数,再对值转换。

   const char * data="abcd";
char * data1,data2,data3 ;
lr_message("data value: %s",data);
// lr_convert_string_encoding(lr_eval_string("{data}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"data2");
// lr_message("data2 value : %s",lr_eval_string("{data2}")); lr_save_string(data,"data1");
lr_message("data1 value: %s",lr_eval_string("{data1}"));
lr_convert_string_encoding(lr_eval_string("{data1}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"data3");
lr_message("data3 value : %s",lr_eval_string("{data3}"));

结果:

Starting action Action.
data value: abcd
Action.c(): Notify: Saving Parameter "data1 = abcd".
Action.c(): Notify: Parameter Substitution: parameter "data1" = "abcd"
data1 value: abcd
Action.c(): Notify: Parameter Substitution: parameter "data1" = "abcd"
Action.c(): Notify: Saving Parameter "data3 = abcd\x00".
Action.c(): Notify: Parameter Substitution: parameter "data3" = "abcd\x00"
data3 value : abcd
Ending action Action.

总结:

1)遇到const 取值时,去掉const

2)将const值保存成另一个参数,通过对新值操作。

这里只是简单的使用例子,这里为啥会用到要对参数值转换呢?比如乱码需要转码时。

 问题:在对服务器返回值重命名时部分值被去掉了

具体描述:通过关联取值str,str中带%2等字符,在用函数值重命名后的新字符串中的%2没有了。在新脚本中尝试一下。

测试版本:LR12.02

测试代码:自定义字符串、参数列表中取值,分别使用sprintf、lr_save_string函数转换并输出结果

Action()
{
char * str = "sdf%2Fdcdegdfs%2opied";
char file[],file1[]; //对直接定义的字符串重命名
lr_save_string(str,"strnew");
lr_output_message("str value : %s",str);
lr_output_message("strnew value : %s",lr_eval_string("{strnew}")); sprintf(file, "%s", str);
lr_output_message("file value : %s",file); //对参数列表中的值重命名
lr_output_message("value : %s",lr_eval_string("{Pname}"));
lr_save_string(lr_eval_string("{Pname}"),"strnew1");
lr_output_message("strnew1 value : %s",lr_eval_string("{strnew1}"));
sprintf(file1, "%s", lr_eval_string("{Pname}"));
lr_output_message("file1 value : %s",file1); return ;
}

测试结果:

Starting iteration .
Maximum number of concurrent connections per server: [MsgId: MMSG-]
Starting action Action.
Action.c(): str value : sdf%2Fdcdegdfs%2opied
Action.c(): strnew value : sdf%2Fdcdegdfs%2opied
Action.c(): file value : sdf%2Fdcdegdfs%2opied
Action.c(): value : sdf%2Fdcdegdfs%2opied
Action.c(): strnew1 value : sdf%2Fdcdegdfs%2opied
Action.c(): file1 value : sdf%2Fdcdegdfs%2opied
Ending action Action.
Ending iteration .

测试结论:新字符串%2正确显示的,并未被去掉。在后续测试时,这项再注意下。

 

lr 函数--lr_save_string的更多相关文章

  1. LR函数基础(一)(二)

    LR函数基础(一) 函数用到:web_reg_find(). lr_log_message(). lr_eval_string().strcmp().atoi() Action(){    web_r ...

  2. LR字符串处理函数-lr_save_string

    int lr_save_string( const char *param_value, const char *param_name) 指定字符串保存至参数 Action() { lr_save_s ...

  3. lr函数之lr_eval_string()函数的使用学习

    lr_eval_string() 函数的主要作用:返回脚本中的一个参数当前的值(从参数中取得对应的值,并且转换为一个字符串). 格式:lr_eval_string("{参数名}") ...

  4. LR函数基础(一)

    函数用到:web_reg_find(). lr_log_message(). lr_eval_string().strcmp().atoi() Action(){    web_reg_find(&q ...

  5. LR函数基础(二)

    (一)用到的函数: (1) web_set_option()   //重定向设置 (2)web_reg_save_param和custom_request都常于处理参数的动态生成. web_reg_s ...

  6. LR中的时间戳函数web_save_timestamp_param

    以前真没注意过后面看某个群有人说到这个函数一查,还真有,那么处理时间戳就简单很多了,我们经常在各种网站上看到类似于这样的时间戳 51Testing软件测试网"d bLq!uR&am ...

  7. lr参数与C语言函数参数的区别

    C变量不能再lr函数中使用: c变量必须定义在lr函数之前: LR参数可以在LR函数中直接当做字符串使用. LR参数是lr自己封装的一个钟对象, LR参数的表达方式:{ParamName}

  8. 【笔记】LR录制方式和常用函数

    本文为本人复习LR时,笔记整理.以备后续查阅. 注意:录制脚本时,选择不同的协议下录制时设置选项也是不相同的,我们这里介绍的是基于协议web(http/html)录制选项设置. 对于web(http/ ...

  9. Loadrunner的字符串函数

    String Function包括 lr_advance_param 指向参数文件中参数的下一个值. lr_convert_string_encoding 将字符串转换为其他编码. lr_decryp ...

随机推荐

  1. 如何去掉C#字符串中的所有空格(转载)

    如何去掉C#字符串中的所有空格 来源:https://www.cnblogs.com/donchen/p/8966059.html 字符串行数Trim()可以去掉字符串前后的空格,如:  C# Cod ...

  2. python学习笔记(十 四)、web.py

    使用web.py 通过python进行网页的编写,下面我们来简单了解一哈web.py 的使用 1 url处理 使用特定的url结构来解析我们发送的请求.如下面所示: urls = ( '/login' ...

  3. Java开发笔记(九)赋值运算符及其演化

    前面的加减乘除四则运算,计算结果通过等号输出给指定变量,注意此时代码把变量放到等号左边.而在算术课本里,加法运算的完整写法类似于“1+1=2”这样,运算结果应该跟在等号右边.不过代数课本里的方程式存在 ...

  4. Android破解学习之路(十三)—— 另类的破解VIP思路

    前言 一般按照以往,我们想要获得某个软件的VIP,一般是通过修改支付宝的支付流程,原本购买失败的,我们修改代码,从而使得失败变成了成功,不花费金钱 另类思路 有些软件将判断用户是否为VIP的代码写在了 ...

  5. string[]转list<long>,List转字符串

    List转字符串,用逗号隔开 List<string> list = new List<string>();list.Add("a");list.Add(& ...

  6. java之equals 与 == 的区别

    == : 1.本质:比较的的是地址,栈内存中存放的对象的内存地址. 2.判断引用所指的对象是否是同一个. 3.两边的操作数必须是同一类型的(可父子类)才能编译通过. 4.值类型(int,char,lo ...

  7. 欧洲AI规范先行,值得肯定与借鉴 --- 我看欧盟发布AI道德规范

    欧洲AI规范先行,值得肯定与借鉴 --- 我看欧盟发布AI道德规范 [事件回放] 近日,据外媒报道,欧盟委员会(EC)任命的人工智能高级专家小组发布了AI开发和使用的道德草案,内容长达37页,提出可信 ...

  8. (详细)华为荣耀V10 BKL-AL00的USB调试模式在哪里打开的步骤

    每当我们使用pc连接安卓手机的时候,如果手机没有开启Usb开发者调试模式,pc则无法成功检测到我们的手机,有时我们使用的一些功能比较强的的app比如以前我们使用的一个app引号精灵,老版本就需要开启U ...

  9. ICD

    International Classification of Diseases,ICD 国际疾病分类

  10. 转:sql server锁知识及锁应用

    sql server锁(lock)知识及锁应用 提示:这里所摘抄的关于锁的知识有的是不同sql server版本的,对应于特定版本时会有问题. 一 关于锁的基础知识 (一). 为什么要引入锁 当多个用 ...