HSP3命令入門講座 <getstr命令>

Last Update : 2009/03/xx

getstr命令 (特定区切りで文字列の切り出し)

 文字列バッファから指定区切りで文字を切り出す命令です。命令名の由来は「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

↑TOP↑

〜HSP3 あれこれ〜
ウィンドウ | オブジェクト | ファイル | フォルダ | キーボード | マウス | メニュー | システム | 文字列 | COM | その他

Copyright © 2005-2011 ゲーム作成ソフトHSPの情報をいろいろと Let's HSP!. All rights reserved.