eller さんの split スクリプト改造

HSP3のスクリプトを垂れ流すブログ: 文字列の分割と結合 の split の処理。コメントでも指摘したのですが、 s = "x x x x x x x x x x " とするとエラーになります。自分ならこうするかなあ、と改造。

parts_num は最初、1 でなく 0 で初期化。そして、いくつに分割できるか調べる処理は以下のように。

改造
    // いくつに分割できるか調べる
    repeat
        ins = instr(_target, cnt, devider)
        part_strlen(parts_num) = ins
        if ins == -1 {
            part_strlen(parts_num) = target_strlen - cnt
        }
        if part_strlen_max < part_strlen(parts_num) {
            part_strlen_max = part_strlen(parts_num)
        }
        parts_num++
        if ins == -1 : break
        continue cnt + ins + devider_strlen
    loop
オリジナル
    // いくつに分割できるか調べる
    repeat target_strlen
        ins = instr(_target, cnt, devider)
        if ins == -1 {
            part_strlen(parts_num - 1) = target_strlen - cnt + 1
            if part_strlen_max < part_strlen(parts_num - 1) {
                part_strlen_max = part_strlen(parts_num - 1)
            }
            break
        } else {
            part_strlen(parts_num - 1) = ins
            if part_strlen_max < ins {
                part_strlen_max = ins
            }
            parts_num++
            continue cnt + ins + devider_strlen
        }
    loop
// 文字列の分割
#deffunc split array arr, str target, str devider
    if devider = "" {
        // 分割する目印は空文字であってはならない
        return 1
    }

    dim part_strlen, 10             // 分割結果の長さ
    part_strlen_max = 0             // 分割結果の長さの最大値
    parts_num = 0                   // 分割結果の数
    _target = target                // instr,strmidを使うために変数に代入する
    target_strlen = strlen(target)  // 分割する文字列の長さ
    devider_strlen = strlen(devider)// 分割する目印の長さ

    // いくつに分割できるか調べる
    repeat
        ins = instr(_target, cnt, devider)
        part_strlen(parts_num) = ins
        if ins == -1 {
            part_strlen(parts_num) = target_strlen - cnt
        }
        if part_strlen_max < part_strlen(parts_num) {
            part_strlen_max = part_strlen(parts_num)
        }
        parts_num++
        if ins == -1 : break
        continue cnt + ins + devider_strlen
    loop

    // 分割結果代入用の配列を確保
    sdim arr, part_strlen_max + 1, parts_num

    // 分割の開始
    position = 0
    foreach arr
        arr(cnt) = strmid(_target, position, part_strlen(cnt))
        position += part_strlen(cnt) + devider_strlen
    loop
    return 0

この記事のスクリプトのオリジナルは eller さんのものです。

インフォメーション

公開日時
2007年12月29日 午前8時38分26秒
最終更新日時
2007年12月29日 午前8時46分32秒
カテゴリ
HSP