第九章 字符串函数
这是一组用于处理字符串类型数据的函数。
函数 | 功能 |
---|---|
StringAdd | 在一个字符串结尾加上另一个字符串(合并字符串) |
StringBufferLen | 返回为字符串分配的缓冲区的大小 |
StringCompare | 比较两个字符串 1 表示 第一个字符串 大于 第二个字符串; 0 表示 两个字符串相等; -1 表示 第一个字符串 小于 第二个字符串。 |
StringConcatenate | 把多个形式参数组成一个字符串,并返回字符串的长度值(整数) |
StringFill | 用选定的字符填充指定的字符串 |
StringFind | 在一个字符串中搜索子字符串 |
StringGetCharacter | 返回位于字符串指定位置的字符 |
StringInit | 按指定的字符初始化字符串,并指定字符串长度 |
StringLen | 返回字符串中字符的数量 |
StringReplace | 在一个字符串中,用一个指定的字符串 查找并替换 所有找到子字符串 |
StringSetCharacter | 在字符串中,从指定位置开始,复制指定数量的字符,组成新的字符串返回。 |
StringSplit | 通过字符串中指定的分隔符,来分割子字符串,返回获得的子字符串的数量 |
StringSubstr | 从指定位置提取字符串 |
StringToLower | 将字符串中所有字符转换为小写 |
StringToUpper | 将字符串中所有字符转换为大写 |
StringTrimLeft | 剪切字符串左边的换行符,空格和制表符 |
StringTrimRight | 剪切字符串右边的换行符,空格和制表符 |
# 9.1 StringAdd
在字符串末尾添加一个子字符串。
bool StringAdd(
string& string_var, // 将要添加内容的字符串
string add_substring // 被添加的子字符串
);
2
3
4
参量 string_var
[in][out] 字符串,用于在末尾添加内容的字符串。
add_substring
[in] 被添加的子字符串,将添加到源字符串的末尾
返回值
成功返回true,否则返回false,为了获得 错误代码,可以调用 GetLastError() 函数。
示例:
void OnStart()
{
long length=1000000;
string a="a",b="b",c;
//--- 第一函数
uint start=GetTickCount(),stop;
long i;
for(i=0;i<length;i++)
{
c=a+b;
}
stop=GetTickCount();
Print("time for 'c = a + b' = ",(stop-start)," milliseconds, i = ",i);
//--- 第二函数
start=GetTickCount();
for(i=0;i<length;i++)
{
StringAdd(a,b);
}
stop=GetTickCount();
Print("time for 'StringAdd(a,b)' = ",(stop-start)," milliseconds, i = ",i);
//--- 第三函数
start=GetTickCount();
a="a"; // 重新初始化变量 a
for(i=0;i<length;i++)
{
StringConcatenate(c,a,b);
}
stop=GetTickCount();
Print("time for 'StringConcatenate(c,a,b)' = ",(stop-start)," milliseconds, i = ",i);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
相关参考
StringConcatenate
# 9.2 StringBufferLen
此函数返回为指定字符串分配的缓冲区大小。
int StringBufferLen(
string string_var // 字符串
)
2
3
参数 string_var
[in] 字符串
返回值
值0表示该字符串是常量,缓冲区大小不能更改。 -1表示该字符串属于客户端,修改缓冲区内容可能会导致不确定的结果。
示例:
void OnStart()
{
long length=1000;
string a="a",b="b";
//---
long i;
Print("before: StringBufferLen(a) = ",StringBufferLen(a),
" StringLen(a) = ",StringLen(a));
for(i=0;i<length;i++)
{
StringAdd(a,b);
}
Print("after: StringBufferLen(a) = ",StringBufferLen(a),
" StringLen(a) = ",StringLen(a));
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
相关参考
StringAdd, StringInit, StringLen, StringFill
# 9.3 StringCompare
该函数是比较两个字符串并且以整数形式返回比较结果。
int StringCompare(
const string& string1, // 用于比较的第一个字符串
const string& string2, // 用于比较的第二个字符串
bool case_sensitive=true // 区分大小写
);
2
3
4
5
参数 string1
[in] 用于比较的第一个字符串。
string2
[in] 用于比较的第二个字符串。
case_sensitive=true
[in] 大小写敏感模式。如果是true,则 "A">"a"。如果是false,则"A"="a"。默认值为 true。
返回值 • -1 (负一), 表示 string1<string2 • 0 (零), 表示 string1=string2 • 1 (一), 表示 string1>string2
注意
字符串是字符与字符相比较,字符根据当前 字符编码集 以字母表的顺序比较。
示例:
void OnStart()
{
//--- 哪个更大 - apple or home?
string s1="Apple";
string s2="home";
//--- 区分大小写的比较
int result1=StringCompare(s1,s2);
if(result1>0) PrintFormat("Case sensitive comparison: %s > %s",s1,s2);
else
{
if(result1<0)PrintFormat("Case sensitive comparison: %s <%s",s1,s2);
else PrintFormat("Case sensitive comparison: %s = %s",s1,s2);
}
//--- 不区分大小写的比较
int result2=StringCompare(s1,s2,false);
if(result2>0) PrintFormat("Case insensitive comparison: %s > %s",s1,s2);
else
{
if(result2<0)PrintFormat("Case insensitive comparison: %s < %s",s1,s2);
else PrintFormat("Case insensitive comparison: %s = %s",s1,s2);
}
/* 结果:
区分大小写的比较: Apple < home
不区分大小写的比较: Apple <home
*/
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
相关参考
字符串类型, CharToString(), ShortToString(), StringToCharArray(), StringToShortArray(), StringGetCharacter(), 使用字符编码集
# 9.4 StringConcatenate
把多个形式参数组成一个普通字符串,并返回字符串的长度值(整数)。参数可以为任意类型。传递的参数总数不得少于2个 或 超过64个。
int StringConcatenate(
string& string_var, // 要形成的字符串
void argument1 , // 任何简单类型的第一参数
void argument2 , // 任何简单类型的第二参数
... // 任何简单类型的下一个参数
);
2
3
4
5
6
参数 string_var
[out] 作为串联结果最终形成的字符串。
argumentN
[in] 用 逗号 分隔的值,数量的范围从2 - 63个,类型为任意简单类型的参数。
返回值
返回字符串长度,并将传递的形式参数串联起来转变成一个字符串类型,根据与 Print() 和 Comment()相同的规则把参数转变成字符串。
示例:
void OnStart()
{
int a;
string str1,str2,str3;
//--- 赋值
str1="Programming";
str2="in MQL5";
str3="for MetaTrader 5";
//--- 调用组合多个字符串的函数
a = StringConcatenate(str1,str1," ",str2," ",str3);
Print("str1 = ",str1);
Print("a = ", a);
}
2
3
4
5
6
7
8
9
10
11
12
13
相关参考
StringAdd
# 9.5 StringFill
用指定的字符填充字符串。
bool StringFill(
string& string_var, // 要添加的字符串
ushort character // 添加字符串的交易品种
);
2
3
4
参数 string_var
[in][out] 用来填充的字符串。
character
[in] 指定的字符。如果是一个数字,则表示对应的 ASCII 字符集上的字符。
返回值
如果成功返回true,否则是false,想要获得 错误代码 可调用函数 GetLastError()。
注意
在字符串中填充字符意味着将字符直接插入到字符串中,而无需 创建 或 复制新字符串的过渡操作。这可以节省操作时间。
示例:
void OnStart()
{
string str;
StringInit(str,20,'_'); // 把字符串 str 初始化为 由20个空格组成的字符串
Print("str = ",str);
StringFill(str,36); // 第二个参数36,表示用ASCII字符集上的对应的字符 $ 来填充字符串
Print("str = ",str,": StringBufferLen(str) = ", StringBufferLen(str));
StringFill(str,’$’); // 第二个参数是一个字符 $,即直接用该字符来填充字符串
Print("str = ",str,": StringBufferLen(str) = ", StringBufferLen(str));
} // 字符编码与字符集(Encoding & CharSet)——害死多少程序员
2
3
4
5
6
7
8
9
10
11
相关参考
StringBufferLen , StringLen , StringInit=
# 9.6 StringFind
在字符串中搜索子字符串。
int StringFind(
string string_value, // 进行搜索的字符串
string match_substring, // 搜索内容
int start_pos=0 // 搜索开始位置
);
2
3
4
5
参数string_value
[in] 用来被搜索的母字符串。
match_substring
[in] 用于搜索的子字符串。
start_pos=0
[in] 指定母子符串中开始搜索的位置索引。默认值0,表示从头开始搜索。
返回值
如果找到 子字符串,返回 子字符串 在 母字符串中的开始位置索引编号;
如果没有找到 子字符串,则返回 -1。
# 9.7 StringGetCharacter
获取字符串中指定位置的一个字符,返回该字符对应的 ASCII 编号。
ushort StringGetCharacter(
string string_value, // 字符串
int pos // 指定字符的位置
);
2
3
4
参数 string_value
[in] 字符串
pos
[in] 指定字符串中的位置,取值范围从 0 到 StringLen(text) -1。
返回值
一个字符的ASCII 编号 或 0表示出错。想要获得 错误代码 可调用函数 GetLastError()。
# 9.8 StringInit
用指定字符初始化一个字符串,并指定字符串缓冲区的大小。
bool StringInit(
string& string_var, // 要初始化的字符串
int new_len=0, // 初始化后字符串缓冲区的大小
ushort character=0 // 用来填充字符串的字符
);
2
3
4
5
参数 string_var
[in][out] 用于 初始化 和 反初始化的字符串。
new_len=0
[in] 初始化结束后的字符串长度,如果长度是0,则表示没有进行字符串初始化,例如,清除字符串的缓冲器,将缓冲器的地址调到0的位置。
character=0
[in] 将交易品种填充字符串。
返回值
如果成功返回true,否则返回false。想要获得 错误代码 可调用函数 GetLastError()。
注意
如果第三个参数character = 0,并且第二个参数 new_len > 0,则指定长度的字符串的缓冲区将被分配并填充为零。字符串长度将等于零,因为整个缓冲区由字符串终止符填充。
示例:
void OnStart()
{
//---
string str;
StringInit(str,200,0);
Print("str = ",str,": StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
}
/* Result
str = : StringBufferLen(str) = 200 StringLen(str) = 0
*/
2
3
4
5
6
7
8
9
10
11
相关参考
StringBufferLen,StringLen
# 9.9 StringLen
返回字符串中字符的数量。
int StringLen(
string string_value // 字符串
);
2
3
参数 string_value
[in] 用于计算长度的字符串。
返回值
字符串中包含字符的数量,不含以 0 结尾的字符。
# 9.10 StringReplace
用一组字符序列替换一个字符串中的搜索到的所有子字符串。(查找并替换)
int StringReplace(
string& str, // 子字符串将被替代的字符串
const string find, // 搜索的子字符串
const string replacement // 子字符串将被插入到发现位置
);
2
3
4
5
参数 str
[in][out] 用于查找并替换的母字符串。
find
[in] 查找的子字符串。
replacement
[in] 用来替换的字符串。
返回值
如果成功,函数返回替换的数量,否则为 -1。想要获得 错误代码 可调用函数 GetLastError()。
注意
如果函数成功运行但是没有替换任何字符串(没有找到符合替换条件的子字符串),则返回0。
错误可能是因为第一个参数str或第二个参数 find不正确(空 或 非初始化字符串,请参阅StringInit())导致的。此外,如果没有足够的内存来完成查找替换,也会发生错误。
例如:
string text="The quick brown fox jumped over the lazy dog.";
int replaced=StringReplace(text,"quick","slow");
replaced+=StringReplace(text,"brown","black");
replaced+=StringReplace(text,"fox","bear");
Print("Replaced: ", replaced,". Result=",text);
// 结果
// 替换:3. Result=The slow black bear jumped over the lazy dog.
//
2
3
4
5
6
7
8
9
相关参考
StringSetCharacter(), StringSubstr()
# 9.11 StringSetCharacter
在字符串中,从指定位置开始,复制指定数量的字符,组成新的字符串返回。
bool StringSetCharacter(
string& string_var, // 字符串
int pos, // 位置
ushort character // 字符
);
2
3
4
5
参数 string_var
[in][out] String.
pos
[in] 在字符串上的位置索引编号,从0 开始到 StringLen (text)
character
[in] Unicode字符集中的字符。
注意 如果 第二个参数pos 小于 字符串长度 并且第三个参数 符号代码值 = 0,则字符串被截断(但为字符串分配的缓冲区大小,保持不变)。字符串长度等于pos。
如果 第二个参数pos 等于 字符串长度,则在字符串结尾添加指定的字符,并将长度加1。
示例:
void OnStart()
{
string str="0123456789";
Print("before: str = ",str,",StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
//--- 在中心添加零值
StringSetCharacter(str,6,0);
Print(" after: str = ",str,",StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
//--- 在末尾添加交易品种
int size=StringLen(str);
StringSetCharacter(str,size,'+');
Print("addition: str = ",str,",StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
}
/* Result
before: str = 0123456789 ,StringBufferLen(str) = 0 StringLen(str) = 10
after: str = 012345 ,StringBufferLen(str) = 16 StringLen(str) = 6
addition: str = 012345+ ,StringBufferLen(str) = 16 StringLen(str) = 7
*/
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cc
相关参考
StringBufferLen, StringLen, StringFill, StringInit
# 9.12 StringSplit
通过字符串中指定的分隔符,来分割子字符串,返回获得的子字符串的数量。
int StringSplit(
const string string_value, // 用于搜索的字符串
const ushort separator, // 被搜索子字符串使用的分隔符
string & result[] // 通过引用传递数组得到寻找的子字符串
);
2
3
4
5
参数 string_value
[in] 用来分隔的母字符串。该字符串不会被改变。
pos
[in] 分隔符的ASCII代码。要获得字符对应的字符集代码,可以使用 StringGetCharacter() 函数。
result[]
[out] 获取的子字符串所在的字符串数组。
返回值 result[]数组中的子字符串的数量。如果在传递的字符串没有找到分隔符,那么将只有母字符串被保存在数组中。
如果母字符串 string_value 为 空 或 NULL,函数将返回零。如果发生错误,则函数返回 -1。想要获得 错误代码 可调用函数 GetLastError()。
例如:
string to_split="_life_is_good_"; // 字符串分成子字符串
string sep="_"; // 分隔符为字符
ushort u_sep; // 分隔符字符代码
string result[]; // 获得字符串数组
//--- 获得分隔符代码
u_sep=StringGetCharacter(sep,0);
//--- 字符串分为子字符串
int k=StringSplit(to_split,u_sep,result);
//--- 显示注释
PrintFormat("Strings obtained: %d. Used separator '%s' with the code %d",k,sep,u_sep);
//--- 现在输出所有获得的字符串
if(k>0)
{
for(int i=0;i<k;i++)
{
PrintFormat("result[%d]=\"%s\"",i,result[i]);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
相关参考
StringReplace(), StringSubstr(), StringConcatenate()
# 9.13 StringSubstr
从字符串中指定位置开始提取子字符串。
string StringSubstr(
string string_value, // 字符串
int start_pos, // 初始位置
int length=-1 // 提取的字符串的长度
);
2
3
4
5
参数 string_value
[in] 用来提取子串的母字符串。
start_pos
[in] 子串在母字符串中的初始位置,从0到 StringLen(text) -1。
Length = -1
[in] 提取子串的长度,如果参数值是 -1或者 没有参数,子串会从指定位置开始提取直到母字符串结束。
返回值
如果可能的话,复制提取的子串,否则返回空字符串
# 9.14 StringToLower
将字符串中所有字符转换为小写
bool StringToLower(
string& string_var // 要处理的字符串
);
2
3
参数 string_var
[in][out] 字符串。
返回值
如果成功,返回值是true,否则是false,想要获得 错误代码 可调用函数 GetLastError()。
# 9.15 StringToUpper
将字符串中所有字符转换为大写
bool StringToUpper(
string& string_var // 要处理的字符串
);
2
3
参数c string_var
[in][out] 字符串
返回值
如果成功,返回值是true,否则是false,想要获得 错误代码 可调用函数 GetLastError()。
# 9.16 StringTrimLeft
剪切字符串左边的换行符,空格和制表符
int StringTrimLeft(
string& string_var // 要剪切的字符串
);
2
3
参数 string_var
[in][out] 要剪切的字符串。
返回值
返回剪切的字符数量。
# 9.17 StringTrimRight
剪切字符串右边的换行符,空格和制表符
int StringTrimRight(
string& string_var // 要剪切的字符串
);
2
3
参数 string_var
[in][out] 要剪切的字符串。
返回值
返回剪切的字符数量。