文字列の宣言と初期化

提供: Appmethod Topics
移動先: 案内検索

文字列の操作 への移動


次の文字列を宣言する場合を考えます。

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 関数を使用します。 他の文字列の型では、LengthSizeOf で乗算します。 たとえば、SUnicodeString である場合は、バイト単位の長さは Length(S) * SizeOf(S) です。

文字列を宣言するときは以下の点に注意してください。

S: string[n];

これは短い文字列(長さが n の文字列ではない)を暗黙的に宣言します。 長さが n である文字列を宣言するには、文字列型の変数を宣言し、SetLength 手続きを使用します。

S: string;
SetLength(S, n);

関連項目