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 さんのものです。