StringToCharArray関数の働き・役割
StringToCharArray関数は、MQL5でUnicodeからANSIに変換された文字列をシンボル(特定の文字や記号)ごとにuchar型の配列に複製するための関数です。
StringToCharArray関数を使用することで、文字列を個々の文字に分割し、それぞれを配列の要素として扱うことができます。例えば、文字列データを操作したり、解析したりする際に便利です。
文字列とは?
文字列とは、文字の並びを意味し、プログラム内でテキストデータを扱うために使用されます。MQL5では、string型で文字列を扱います。文字列は、ユーザーへのメッセージ表示、ログ出力、ファイルの読み書きなど、多くの場面で利用されます。
文字配列とは?
文字配列とは、文字を要素とする配列のことです。文字列を個々の文字に分割して配列として保持することで、特定の文字にアクセスしたり、操作したりすることが容易になります。MQL5では、uchar型またはushort型の配列として文字配列を扱います。
StringToCharArray関数の引数について
int StringToCharArray(const string text_string, uchar &array[], int start = 0, int count = -1, uint codepage = CP_ACP);
第1引数は変換したい文字列を指定します。この文字列はstring型です。
第2引数は変換後の文字配列を格納する配列を指定します。この配列はuchar型で事前に宣言しておく必要があります。
第3引数は変換の開始位置を指定します。この引数は省略可能で、初期値は0です。
第4引数は変換する文字数を指定します。この引数も省略可能で、初期値は-1です。-1は、文字列の最後まで変換することを意味します。
第5引数はコードページの値を指定します。この引数も省略可能で、初期値はCP_ACP(デフォルトのANSIコードページ)です。
※コードページとは、文字を数値として表現するためのルールのセットです。
各コードページは特定の言語や地域に対応しており、文字を特定の数値(バイトの並び)に変換します。
例えば、CP_ACPは現在のWindowsのデフォルトのコードページを示し、CP_UTF8はUTF-8エンコーディングを示します。
CP_ACPは主に英語などのラテン文字に対応しており、CP_UTF8は多くの言語に対応する国際的な標準です。
コードページを指定することで、文字データを異なるエンコーディングで扱うことができ、異なる言語の文字セットを正確に表示できます
StringToCharArray関数の戻り値について
StringToCharArray関数は変換された要素の数を返します。指定された文字列から配列に変換された文字の数を示します。
StringToCharArray関数を使う際の注意点
StringToCharArray関数を使用する際には、配列のサイズが十分であることを確認してください。配列のサイズが不十分だと、データの一部が失われる可能性があります。また、配列の宣言時には十分なメモリを確保しておくことが重要です。
StringToCharArray関数を使ったサンプルコード
以下に、StringToCharArray関数を使用した具体的なサンプルコードを示します。このサンプルコードは、文字列を文字配列に変換してエキスパートログに出力します。
// OnStart関数はスクリプトの実行が開始されたときに自動的に呼び出されます
void OnStart()
{
// 変換する文字列を定義します
string text = "Hello, MQL5!";
// 文字配列を定義します(文字列の長さに合わせて十分なサイズを確保します)
uchar charArray[];
// StringToCharArray関数を使用して、文字列を文字配列に変換します
int length = StringToCharArray(text, charArray);
// 変換された文字数をエキスパートログに出力します
Print("変換された文字数: ", length);
// 文字配列の内容をエキスパートログに出力します
for(int i = 0; i < length; i++)
{
Print("charArray[", i, "] = ", charArray[i]);
}
}
サンプルコードに使われた関数や文法要素の簡単な解説
OnStart関数はスクリプトの実行が開始されたときに自動的に呼び出される関数です。この関数内で初期化処理やメイン処理を行います。
string型は文字列を表すデータ型です。文字列は一連の文字から構成され、テキストデータを扱うために使用されます。
uchar型は符号なし文字を表すデータ型です。0から255までの範囲の数値を扱うことができます。
StringToCharArray関数は文字列を文字配列に変換する関数です。変換後の文字配列は、ログ出力やデータ操作に利用されます。
Print関数は指定した文字列をエキスパートログに出力する関数です。デバッグや情報表示に使用されます。
公式リファレンスのサンプルコードについて
以下に、公式リファレンスのサンプルコードを示し、その挙動について初学者向けに解説します。
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 変換する文字列
string text = "This is a test of the StringToCharArray() function";
//--- 設定されたコードページに従って入力文字列をuchar配列に変換する
uchar char_array[]; // uchar型の配列を宣言
int copied = StringToCharArray(text, char_array); // 文字列をuchar配列に変換し、変換された文字数を取得
//--- 文字列の長さと変換された文字数をエキスパートログに出力する
PrintFormat("String length: %u\nNumber of characters copied (with terminal 0): %d\nArray of characters for the string '%s':",
StringLen(text), copied, text);
//--- 結果の配列を操作ログに出力する
ArrayPrint(char_array, 0, " | ");
/*
結果:
String length: 50
Number of characters copied (with terminal 0): 51
Array of characters for the string 'This is a test of the StringToCharArray() function':
[ 0] 84 | 104 | 105 | 115 | 32 | 105 | 115 | 32 | 97 | 32 | 116 | 101 | 115 | 116 | 32 | 111 | 102
[17] 32 | 116 | 104 | 101 | 32 | 83 | 116 | 114 | 105 | 110 | 103 | 84 | 111 | 67 | 104 | 97 | 114
[34] 65 | 114 | 114 | 97 | 121 | 40 | 41 | 32 | 102 | 117 | 110 | 99 | 116 | 105 | 111 | 110 | 0
*/
}
各文法要素の解説
string text = “This is a test of the StringToCharArray() function”;
- 変換する文字列を定義します。この文字列はStringToCharArray関数によって配列に変換されます。
uchar char_array[];
int copied = StringToCharArray(text, char_array);
- StringToCharArray関数を使用して文字列をuchar配列に変換します。変換された文字数が返され、変数copiedに格納されます。
PrintFormat(“String length: %u\nNumber of characters copied (with terminal 0): %d\nArray of characters for the string ‘%s’:”, StringLen(text), copied, text);
- PrintFormat関数を使用して文字列の長さ、変換された文字数、元の文字列をエキスパートログに出力します。
- StringLen関数は文字列の長さを返します。
- フォーマット指定子%uは符号なし整数、%dは整数、%sは文字列を示します。
ArrayPrint(char_array, 0, ” | “);
- ArrayPrint関数を使用して、配列の内容をエキスパートログに出力します。配列の各要素は区切り文字 ” | ” を使用して表示されます。
‘This is a test of the StringToCharArray() function’がなぜこのような数値の並びになっているのか?
- 文字列の各文字は、それぞれのASCIIコードに対応する数値で表されます。例えば、’T’は84、’h’は104、’i’は105です。これらの数値が配列に格納され、文字列の各文字がその対応する数値に変換されます。
Number of characters copied (with terminal 0): 51という表記の意味