前のページ次のページ上に戻るホーム SophiaFramework 2.2

4.6. バッファの直接操作

文字列クラスでは提供されていない操作を行いたい場合は、 文字列クラスの所有するバッファ ポインタを取得して、 直接メモリにアクセスします。

SFUAnsiString astr("No smoking");
AChar * pch = astr.GetRaw();
pch[0] = 'D';

GetRaw 関数は文字列クラスが所有しているバッファへのポインタをそのまま返します。 内部バッファがないときは NULL を返しますので、 必ず NULL ポインタのチェックを行うようにしてください。

文字列クラスの操作を行うと、内部バッファのアドレスが変更されることがあります。 内部バッファのアドレスを GetRaw で取得した後に、 その文字列クラスに対して操作を行うと、 取得したアドレスが内部バッファを指さないことがありますので、 十分に注意をしてください。

SFUAnsiString astr("Harry Potter");
AChar * pch = astr.GetRaw();
astr.Replace("Harry", "Horry");
pch[0] = 'S';         // 誤りです

この例では、Replace 関数により文字列クラスのバッファ ポインタが変更されている可能性があります。 Replace 関数を呼び出した後に、 pch 変数に記憶しておいたポインタでメモリにアクセスすると、 文字列クラスの内部バッファ以外のメモリを書き換えてしまうことがあるため、 このような使用法は誤りです。

GetRaw() で内部バッファのポインタを取得する代わりに、 直接にバッファを読み書きすることもできます。 読み取りには GetRaw() の引数にインデックスを指定します。 書き込みには SetRaw() 関数を使います。 たとえば、次の例では、文字列中のスペースをアンダースコアに置換しています。

SFUAnsiString str = "Poppy Loppy";
SIntN i;
for (i = 0; i < str.Length(); i++) {
    if (str.GetRaw(i) == ' ') {
        str.SetRaw(i, '_');
    }
}

このように内部バッファを直接読み書きすることで、 高速な文字列処理が可能となりますが、 これらの関数は、内部バッファが NULL かどうかの確認や、 インデックスが有効範囲内であるかどうかの確認を行っていないため、 正しくプログラムをかかなければ、動作が異常になりますので注意してください。