文字列の宣言と初期化
文字列の操作 への移動
次の文字列を宣言する場合を考えます。
S: string;
これを初期化する必要はありません。 文字列は自動的に空に初期化されます。 文字列が空であるどうかをテストするには、次のとおり EmptyStr
変数を使用する
S = EmptyStr;
または空の文字列に対してテストします。
S = '';
空の文字列には有効なデータがありません。 したがって、空の文字列の索引化を試行すると、nil
へのアクセスを試行と同様で、結果としてアクセス違反が発生します。
var
S: string;
begin
S[i]; // これはアクセス違反を起こす
// 各ステートメント
end;
同様に、空の文字列を PChar
にキャストする場合、結果は nil
ポインタです。 したがって、PChar
などを読み取りや書き込みが必要なルーチンに渡す場合は、ルーチンが nil
を処理できることが必要です。
var
S: string; // 空文字列
begin
proc(PChar(S)); // proc が nil を処理できること
// ステートメント
end;
できない場合は、次のとおり文字列を初期化できます。
S := 'No longer nil';
proc(PChar(S));// もう proc は nil を処理する必要はない
または、SetLength
手続きを使用して長さを設定します。
SetLength(S, 100); // S の動的な長さを 100 文字に設定
proc(PChar(S)); // もう proc は nil を処理する必要はない
SetLength
を使用するとき、文字列内の既存の文字は保持されますが、新たに割り当てられた領域の内容は未定義です。 SetLength
の呼び出し後、S
は必ず、一意な文字列(参照カウントが 1 の文字列または配列)を参照しています。
文字列リテラルはデフォルトで Unicode です。 文字列を ANSI 文字で初期化するには、次のとおりリテラルをキャストします。
AnsiString S;
S := AnsiString('Unicode string');
文字列の長さを要素 elements
単位で取得するには、Length
関数を使用します。MBCS 文字列や Unicode 文字列の場合は、これは必ずしも文字数ではないことに注意してください。
文字列の長さをバイト単位で取得するには、SizeOf
関数を使用します。 他の文字列の型では、Length
を SizeOf
で乗算します。 たとえば、S
が UnicodeString である場合は、バイト単位の長さは Length(S) * SizeOf(S)
です。
文字列を宣言するときは以下の点に注意してください。
S: string[n];
これは短い文字列(長さが n
の文字列ではない)を暗黙的に宣言します。 長さが n
である文字列を宣言するには、文字列型の変数を宣言し、SetLength
手続きを使用します。
S: string;
SetLength(S, n);