文字列の一部を抽出(getstr) 『HSP3』


文字列の一部を抽出します。抽出には「getstr」命令を使います。

getstr p1,p2,p3,p4
 p1: 抽出した文字列を格納する変数
 p2: 対象文字列
 p3: 抽出開始バイト
 p4: 区切り文字(ASCIIコード)
 
 
1
2
3
4
例1)
p2 = "ABCXDEFXG"
getstr p1,p2,0,'X'
mes p1
mes strsize
  (結果)
ABC
4

例1は、p2(ABCXDEFXG) の文字列から0バイトを開始位置(つまり先頭)として文字「X」までを抽出しています。区切り文字は「ASCIIコード」で指定するようですが、' (シングルクォーテーション)で囲めばASCIIコードになるようです。ですので今回は区切り文字「X」をシングルクォーテーションで囲みました。結果は変数p1に格納されます。結果をみると「ABC」ですので区切り文字は含まれないようです。4行目の「strsize」はgetstr命令を使ったときのシステム変数です。抽出した文字列のバイト数を格納しています。今回は4バイトとなってますので、strsize には区切り文字のバイト数も含まれているようです。

 
 
1
2
3
4
例2)
p2 = "ABCXDEXFG"
getstr p1,p2,4,'X'
mes p1
mes strsize
  (結果)
DE
3

例2は抽出の開始位置を変えただけです。今回の開始位置は4バイトになってます。例1の結果では最初の区切り文字「X」までが4バイトでした。そこから開始で区切り文字「X」がみつかるまでの抽出になるので例2の結果は「DE」となってます。strsizeのバイト数は区切り文字も含まれているので「DEX」の3になってます。

結果をみてみると開始バイト位置ですが、指定したバイト数が終わった次からのようです。例1では0バイト終わった直後の1バイト目「A」から開始し、例2では4バイト目である最初のXの次の「D」から開始しています。

 
 
1
2
3
4
例3)
p2 = "ABCXDEXFG"
getstr p1,p2,7,'X'
mes p1
mes strsize
  (結果)
FG
2

例3は抽出の開始位置を「7」に変えただけです。7バイトというのは2回目の「X」までのバイト数です。2回目の「X」以降にはもう区切り文字「X」がありません。どうなるかみてみます。結果は開始位置から最後までが抽出されました。

 
 
1
2
3
4
例4)
p2 = "ABC¥nDEFXG"
getstr p1,p2,0,'X'
mes p1
mes strsize
  (結果)
ABC
5

例4はp1の最初の「X」を「¥n」に変えました。「¥n」は改行コードです。結果は区切り文字「X」があるにもかかわらず途中の「¥n」で区切られてしまいました。改行があるとそこで終わりと判断されるようです。strsize は改行コードが2バイトなので「ABC¥n」で5になってます。

 
 
1
2
3
4
例5)
p2 = "ABCXDEFXG"
getstr p1,p2,0,'XG'
mes p1
mes strsize
  (結果)
ABC
4

例5は区切り文字を「XG」にしました。抽出文字は「ABCXDEF」となりそうですが結果は「ABC」と最初の「X」までです。それは区切り文字は1バイト判断なので「XG」としても最初の1バイト「X」のみが区切り文字だと判断されてしまう為です。

 
 
1
2
3
4
例6)
p2 = "ABCDEFXG"
getstr p1,p2,0,''
mes p1
mes strsize
  (結果)
ABC
4

例5は文字列に「ABCDEFXG」を青という漢字を含め、区切り文字も「聖」と漢字にしました。漢字は2バイト以上になるので正しく判断できません。「青」と「聖」は両方「セイ」と読みますが、似たような読み方する漢字は最初の1バイトが同じになる可能性があるので1バイトだけでは唯一で判断できません。そもそもASCIIコードに漢字はありませんが。

2バイト以上になればエラーになってくれたほうがバグをみつけやすくていいのですが、なぜかエラーが起こりません。結果がおかしいときは区切り文字が2バイト以上になっていないか調べてみてください。
 


「文字列の一部を抽出(getstr) 『HSP3』」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です