文字列操作
今回は変数に代入されている文字列を扱う命令群について説明していきたいと思います。
文字列操作は使用頻度が高いものですので取り上げてみました。
まずは文字列の一部を取り出すstrmid命令についてやっていきます。
書式は「strmid 取り出した文字列を入れる変数,取り出し元の変数,取り出し位置,何文字」です。
簡単に説明しますとp2で指定した変数のp3文字目からp4文字分を取り出しp1に代入するわけです。
HSPでは一番初めを表す物の数値はほとんどが0になります。
カレントポジションやカウントのcnt変数も0からというように文字列の一番初めも0から数えていきます。
strmid命令ではp3の取り出し位置(何文字目からか)は1文字目を0番として考えていくことになります。
tmp = "abcdefghijklmnopqrstuvwxyz"
strmid buf, tmp, 5, 3 ; tmpの6文字目から3文字取り出しbufに代入
mes "tmp = " + buf
stop
というような使い方をします。
p4の数値が取り出し元の文字数より多めに指定してもエラーにはならず最後の文字まで取り出します。
p3に−1を指定すると文字列の最後からp4文字(バイト)分取り出す事ができます。
例えばファイル名の入っている変数の拡張子を取り出すときなどに便利です。
tmp = "sample.bmp"
strmid buf,tmp,-1,3 ; 後ろから3文字取り出す
mes "拡張子は" + buf + "です?" ; 拡張子によっては2文字や4文字以上の場合もあるので注意
stop
次に変数のサイズを測るstrlen命令の説明をしたいと思います。
書式は「strlen 代入する変数,調べる変数」で、「調べる変数」のサイズが「代入する変数」に入ります。
buf = "ここはHotSoupProcessor beginner'sClubです"
strlen len, buf
mes "bufのサイズは" + len + "です"
stop
strlen命令は文字数を数えるものではありません。サイズ(バイト数)を測るものです。
ですので、全角文字(上記サンプルではひらがな)は1文字で2となります。
文字数を数えたい場合TIPS文字列編に用意したものをご利用ください。
はい、strlen命令はコレで終了で、次にメモリーノートパッド関係に入ります。
メモリーノットパッド命令とは変数内の「\n」(改行)までの1行を1データとして扱う命令です。
まずどの変数をメモリーパッドノートの対象にするかということ決めます。
指定はnotesel命令を使用します。書式は「notesel 対象にする変数」です。
buf = "頭\n肩\n胸\n腰\n股\n足"
mes buf
notesel buf ; 変数bufを対象にする
stop
メモリーノットパッドは文字列操作を行うのに非常に有効なもので、
データ行数の取得、行単位の追加や上書き、行単位の削除が楽にできるようになります。
初めにデータを別の変数に取り出してみましょう。
命令名は「noteget」で、書式は「noteget データを入れる変数,番号」です。
p2の番号には上の方で説明したようにやはり0番〜始まっています。
buf = "頭\n肩\n胸\n腰\n股\n足"
notesel buf ;変数bufを対象にする
noteget tmp, 2 ;変数tmpに上から3番目のデータを取り出す
mes tmp
stop
次にメモリーノートパッドにデータを追加するnoteadd命令に移りましょう。
追加にはデータとデータの間に追加する「挿入」と元のデータとすりかえる「上書き」があります。
書式は「noteadd 追加するデータ,番号,挿入or上書き設定」です。
p1の追加するデータは文字列を直接指定するか、変数で指定します。
p2の番号はメモリーノットパッドの何行目に追加するかを指定します。
p3に0または省略すると、メモリーノットパッドのp2行目にp1のデータを挿入します。
buf = "頭\n肩\n胸\n腰\n股\n足"
mes "" + buf + "\n ↓"
notesel buf
noteadd "腕", 2 ; p3を省略したので挿入モード
mes buf
stop
p3に1を指定すると、もともとのp2行目のデータをp1のデータに変更します。
buf = "頭\n肩\n胸\n腰\n股\n足"
tmp = "膝"
mes "" + buf + "\n ↓"
notesel buf
noteadd tmp,4, 1 ; 上から5個目のデータを変更
mes buf
stop
今度は逆にデータを削除するnotedel命令を伝授しましょう。
書式は「notedel 削除する番号」。削除後は自動的に削除以降のデータが1つ上にシフトされます。
buf = "頭\n肩\n腕\n胸\n腰\n膝\n足"
mes "" + buf + "\n ↓"
notesel buf
notedel 3 ; 上から4番目のデータを削除する
mes buf
stop
最後にデータの数を数える命令「notemax」の説明をします。
書式は「notemax 数を入れる変数」です。
p1で指定した変数にメモリーノットパッドのデータ数を代入します。
buf = "頭\n肩\n腕\n胸\n腰\n膝\n足"
notesel buf
notemax tmp ; 変数tmpにbufのデータ数が入る
mes "データの数は" + tmp + "です"
stop
例えばデータを別々の変数(配列変数)に入れる時に使います。
sdim data, 10, 8
sdim buf, 100
buf = "Japan\nKanada\nEngland\nItaria\nAmerica\nChaina\nFinland\nGerman"
notesel buf
notemax kosuu
repeat kosuu
noteget data.cnt,cnt
loop
mes data.5 ; data.0〜data.7までbufのデータがコピーされました
stop