最后由 麻爪 于 2026-9-7 16:42 编辑
第十二章 字符串
一、字符串数据及其写法
字符串(string)是用来保存一段文字文本,比如名字、日志内容、打印提示文字。但代码中的注释内容可不属于字符串,字符串数据多用在名字、标签、日志、外部交互、文件名等情景。
注意,字符串数据是非数字数据,不能用来做运算。
前面介绍字符常量时提到,字符串本质上是一堆字符组成的序列,每个字符都有 ASCII 数字编码。
写在代码源码里的固定文本常量,必须用英文双引号 " " 包裹。
string s = "这是一串字符常量"; //双引号包裹,这就是字符串常量,赋值给string类型的变量s
注意,单引号 ' ' 用来放单个字符常量,双引号 " " 才是字符串,不要搞混。
双引号本身是字符串的边界符号。如果你直接写:string str = "他说:"你好"";编译器看到第二个 ",会误认为字符串在这里结束,直接代码报错。想要字符串文本内部出现双引号,就要在引号前面加反斜杠 \ 进行转义(转义符)。
string str = "他说:\"你好\""; Print(str); //输出:他说:"你好"
\ 就是转义符:\ + 某个字符,组合成特殊符号塞进字符串里。
二、长字符串数据的拆分写法
MQL5(和 C/C++ 一样)写很长的字符串常量,可以拆成好几段双引号字符串,中间直接换行隔开,编译器编译的时候会自动把几段拼接合并成一整个字符串,不需要写加号、不需要调用拼接函数。目的就是让源代码好看、可读,不用写一整行超长文字。
一行拉得特别长的字符串示例:
string msg = "EA启动,初始化参数,检查品种、周期、仓位,打印日志输出信息";
拆分写法,分成多段,代码更清爽示例:
string msg = "EA启动,初始化参数," "检查品种、周期、仓位," "打印日志输出信息";
三、字符串的拼接
在 MQL5 里,string 字符串支持 + 加号做拼接。
示例:
string a = "市价开仓:"; string b = "EURUSD"; string c = a + b; Print(c); //输出:市价开仓:EURUSD
还可以可以直接拼接常量、变量混用:
string msg = "当前品种:" + _Symbol + ",价格:"; //_Symbols是MQL5 的内置预定义字符串变量,当前品种的名称,
但数字不能直接和字符串相加,需要转换数据类型:
string s = "手数:" + 0.1; //编译报错 string s = "手数:" + DoubleToString(0.1,2); //把双精度浮点数0.1转化为字符串格式,括号里的2表示保留2位小数
也可以简单写:
string s = "手数:" + "0.1"; //只要双引号括起来,系统就当这是文本,而不是数字了
用转换函数或者双引号括起来的数字和字符串拼接,效果看起来几乎是一样的。
但实际应用场景有很大不同。如果这个0.1是固定数值,你不需要变化它,那么两种方法没区别。如果这个0.1是变化的,你用双引号就没办法实现了。
比如:
double lot = 0.1; string s = "手数:"+"0.1"; string s = "手数:" + DoubleToString(0.1,2);
这种情况下,两种写法看上去没啥区别。但lot这个变量是会变化的,它可能是一个分析逻辑分析出来的加仓数量,这种情况下加0.1,另一种情况下加0.2,所以当lot数值变化的时候,下面的写法都不会跟着变,这就失去了设计变量lot的意义。
但我们不能把字符串和变量名字拼在一起,比如:
ouble lot = 0.2; string s = "手数:"+"lot"; //这种写法相当于把 手数:和字母 lot拼在了一起,跟数字0.2没关系,虽不报错,但没有业务上的意义
string s = "手数:" + lot; // 这种写法相当于把 手数:和数字0.2拼在了一起,因为数据类型不同,程序会报错 正确的写法是用类型转换函数给变量转换数据类型:
string s = "手数:" +DoubleToString( lot,2);
这样 手数: 后面拼接的数字,就可以随着变量lot的不同数值变化了。 |