Last Update : 2009/03/xx
文字列バッファから指定区切りで文字を切り出す命令です。命令名の由来は「get string」から。
getstr 結果を入れる変数, 元の文字列バッファ, 読み出しインデックス, 区切りキャラクタ
第1パラメータには、適当な変数を指定しておきます。この変数に切り出した文字列が代入されます。デフォルトでは64バイト分確保されますが、それ以上のサイズの文字列が格納されるなら、あらかじめsdim命令で大きめのバッファサイズを確保するのを忘れないでください。確保していない場合は、HSPエラー「バッファオーバーフローが発生しました」(エラー番号20)になり、プログラムは強制終了してしまいます。
第2パラメータには、もともとの切り出す文字列が格納されてる文字列型変数を指定します。第3パラメータには、切り出し始めるインデックス番号を指定します。インデックスは0(0バイト目)から始まります。
第4パラメータには、切り出し区切りのキャラクタ文字を指定します。ここは半角文字のみで有効で、全角文字(ひらがな、全角カタカナ、漢字)は適用できません。このパラメータを省略した場合は、「\n」と「0x00」だけが区切りとなります。
ちなみに、キャラクター文字は次のようなアポストロフィーでくくった形式で指定するといいです。
第4パラメータ | |
a-z、A-Z、0-9、記号 | 'a' |
半角スペース | ' ' |
円記号 | '\\' |
アポストロフィー | '\'' |
ダブルコーテーション | '"' |
システム変数strsizeには、切り出したバイトサイズが返ります。0が返ってきた場合は、第2パラメータの元々の文字列の読み出しインデックスが最後まで到達したことを意味します。
HSPでの文字列切り出し処理は、getstr命令以外にstrmid関数があります。これは指定した位置から指定文字数分だけ切り出すことができるものです。また、HSP 3.2〜では指定区切りで切り出し分解して各変数に代入するsplit命令、指定文字を取り除いた結果を返すstrtrim関数が存在します。
^
言葉での命令説明はいまいち難しいので、実例的なサンプルソースをいくつか。
まずは、「,」(コンマ/カンマ)と「 」(半角スペース)のような記号で区切られた文字列を1つ1つ取り出して表示してみーる。キャラクタ文字は、「’」(アポストロフィー)でくくると、アスキーコード値に変換されます。HSP付属のドキュメント「HSP3文字列のひみつ(中級者向け) (hsp3str.htm)」を参照あれ。
; 「,」区切りの切り出し data = "AA,BBB,C@CC,DD,E-EEE,FF,HSP!getstr" i = 0 repeat getstr kekka, data, i, ',' ; 読み出せなくなったらループを抜ける if strsize = 0 : break mes ""+kekka+" ["+i+"] ; 次のための切り出し始めのインデックス番号 i += strsize loop mes "終わり!"
; 半角スペース区切りの切り出し data = "Hi, nice to meet you. My name is Kpan." i = 0 repeat getstr kekka, data, i, ' ' if strsize = 0 : break mes ""+kekka+" ["+i+"] i += strsize loop mes "終わり!"
次に、「\n」(改行)区切りの切り出しです。getstr命令の第4パラメータを省略する形にします。テキストファイルから切り出した行の文字列を配列変数に入れてみるサンプルコード。
// 「\n」区切りの切り出し (by Kpan) ; HSP本体のReadmeファイルを想定 notesel buf noteload "readme.txt" ; 文字列型配列変数を用意 (要素数5個、配列1個のサイズは128バイト) sdim kekka, 128, 5 i = 0 repeat 5 // ひとまず5行分 getstr kekka.cnt, buf, i if strsize = 0 : break i += strsize loop mes "2行目:"+kekka.1 mes "4行目:"+kekka.3
文字列の置換のサンプルコードです。元々のスラッシュ部分を「まーる・さんかく・しかーく♪」文字列に置き換えます。poke命令のヘルプブラウザでの説明にある「p3に文字列を指定した場合には、文字列データをメモリに展開し、strsizeに、書き込まれた文字列の長さを返します。」を利用してます。
// 文字列置換 (by Kpan) data = "ホット/スープ/プロセッサ/命令/講座/だよ〜ん" mes data + "\n" ; ちゃんとバッファを確保しとかないとバッファオーバーフローエラー sdim kekka sdim data2, 128 i = 0 ii = 0 repeat getstr kekka, data, i, '/' if strsize = 0 : break i += strsize ; 切り出した文字列をメモリに展開 poke data2, ii, kekka + "●▲■" ii += strsize loop mes "置換結果:" mes data2
文字を縦書きで出力するテキトーなサンプルコードです。getstr命令を使って2バイト文字前提で切り出します。1バイト文字を扱うなら、半角スペースを付け足してください。
// 文字の縦書き出力 (by Kpan) picload "sample\\demo\\sky_bg.jpg", 1 font "HGP行書体", 25, 1 | 16 color 255 pos 400, 10 data = "むかしむかしの、じいさんばあさん。" gosub *draw_string wait 50 pos 435, 50 data = "あひゃひゃ、皮へ選択、山へ紙ば仮。" gosub *draw_string stop ; 文字の切り出し出力部分 *draw_string i = 0 repeat // 2バイト分切り出す getstr hoge, data, i, , 2 if strsize = 0 : break ; いちおう句読点の位置ずらし用 if hoge = "。" | hoge = "、" { // フォントサイズに合わせて調節する必要あり pos ginfo(22) + 15, ginfo(23) - 10 mes hoge pos ginfo(22) - 15, ginfo(23) + 10 } else { mes hoge } i + 2 ; 一瞬で表示したいなら不要 wait 20 loop return