HSP | 日本語等も一文字として strlen, strmid
HSP | 日本語等も一文字として strlen, strmid
コード
/**
* メイン
*/// 文字列の長さ
mes strlen_("aiueo")
mes strlen_("あいうえお")
mes strlen_("aいuえo")
mes// 文字列の一部を取り出す
mes strmid_("aいuえo", 2, 2)
mesmes strmid_("aいuえo", -1, 1)
mes strmid_("aいuえo", -2, 2)
mes strmid_("aいuえo", -3, 1)
mesmes strmid_("aいuえo", 0, -1)
mes strmid_("aいuえo", 2, -1)
mes strmid_("aいuえo", 3, -1)
mes strmid_("aいuえo", -3, -1)
messtop
/**
* 文字列の長さを調べる (日本語等も一文字)
*/
#defcfunc strlen_ str sl = 0
sdim buf, strlen(s) * 2 + 2
cnvstow buf, srepeat
if ( 0x0000 == wpeek(buf, cnt * 2) ) : break
l++
loopreturn l
/**
* 文字列の一部を取り出す (日本語等も一文字)
*
* index がマイナスのときの挙動変更 (後ろからのインデックス)
* len がマイナスのときの挙動変更 (後ろからのインデックス)
*/
#defcfunc strmid_ str s, int index, int lensdim buf, strlen(s) * 2 + 2
cnvstow buf, s// インデックスを修正
if ( index >= 0 ) {
i = 0
repeat index
if ( 0x0000 == wpeek(buf, cnt * 2) ) : break
i++
loop
} else {
i = 0
repeat
if ( 0x0000 == wpeek(buf, cnt * 2) ) : break
i++
loop
i = limit(i + index, 0, i)
}// 長さを修正
if ( len >= 0 ) {
l = 0
repeat len, i
if ( 0x0000 == wpeek(buf, cnt * 2) ) : break
l++
loop
} else {
l = 0
repeat , i
if ( 0x0000 == wpeek(buf, cnt * 2) ) : break
l++
loop
l = limit(l + len, 0, l)
}// 切り出し
memcpy buf, buf, l * 2, 0, i * 2
wpoke buf, l * 2, 0x0000return cnvwtos(buf)