字符串连接

字符串连接可能是最常见的字符串运算。在 MQL5,可以使用 '+' 或 '+=' 运算符完成。第一个运算符连接两个字符串('+’ 号左边和右边的两个操作数),并创建一个临时连接字符串,可为其赋予一个目标变量或传递给表达式的另一部分(诸如函数调用)。第二个运算符将运算符 '+=' 右边的字符串附加到本运算符左边的字符串(变量)。

此外,MQL5 API 提供了用于从其它字符串或其它类型的元素组成字符串的若干个函数。

这些函数的使用示例在 StringAdd.mq5 脚本中提供,该脚本在其说明之后进行讲解。

bool StringAdd(string &variable, const string addition)

该函数将指定 addition 字符串附加到 variable 字符串变量的末尾。在可能的情况下,系统使用 variable 字符串的可用缓冲区(如果其大小足以用于组合结果),而不会重新分配内存或拷贝字符串。

该函数等效于运算符 variable += addition。时间和内存消耗大致相同。

如果成功,函数返回 true,如果出错,返回 false

int StringConcatenate(string &variable, void argument1, void argument2 [, void argumentI...])

该函数将两个或多个 内置类型 的自变量转换为字符串表示,并将它们在 variable 字符串中连接起来。这些自变量从该函数的第二个参数开始传递。不支持将数组、结构体、对象、指针作为自变量。

自变量的数量必须在 2 到 63 之间。

自变量字符串按原样添加至生成的变量。

double 类型的自变量以最大精度(最多 16 位有效数字)转换,如果可以达到更紧凑的结果,可以选择带指数的科学计数法。float 类型的自变量以 5 个字符显示。

datetime 类型的值转换为包含所有日期和时间字段 ("YYYY.MM.DD hh:mm:ss") 的字符串。

枚举、单字节和双字节字符输出为整数。

color 类型的值显示为 "R,G,B" 分量三元组或者颜色名称(如果在标准 web 颜色列表中可用)。

转换 bool 类型时,使用字符串 "true" 或 "false"。

StringConcatenate 函数返回生成字符串的长度。

StringConcatenate 设计用于从接收变量以外的其它来源(变量、表达式)构建字符串。不建议使用 StringConcatenate 通过调用 StringConcatenate(variable, variable, ...) 来将新的数据块连接到相同的行。此函数调用未经优化,相比运算符 '+' 和 StringAdd 来说要慢得多。

StringAddStringConcatenate 函数在 StringAdd.mq5 脚本中测试,该脚本使用 PRTE 宏和 StrOut 辅助函数(参见 上一节)。

void OnStart()
{
   string s = "message";
   StrOut(s);
   PRTE(StringAdd(s"r"));
   StrOut(s);
   PRTE(StringConcatenate(sM_PI * 100" "clrBluePRICE_CLOSE));
   StrOut(s);
}

其执行之后,日志中会显示以下行:

'message' [7] 0
StringAdd(s,r)=true
'messager' [8] 260
StringConcatenate(s,M_PI*100, ,clrBlue,PRICE_CLOSE)=true
'314.1592653589793 clrBlue1' [26] 260

该脚本还包含头文件 StringBenchmark.mqh,其中具有benchmark 类。它为在脚本中实现的派生类提供了用于测量各种字符串添加方法的性能的框架。尤其是,它们确保了使用运算符 '+' 添加字符串与使用 StringAdd 函数添加字符串具有可比性。这方面在单独的研究中探讨。

此外,本书提供了 StringReserve.mq5 脚本:它对使用或未使用缓存器 (StringReserve) 添加字符串的速度进行了直观比较。