OriosのActiveBasic講座(1-3):プロシージャ

4.文字列関数

【目標】文字列関数の使い方をマスターして文字列を自由自在に扱えるようになりましょう。

前回は数値計算に関係のある関数について勉強しましたが、今回は文字列を操作する関数を学習します。 文字列関数を操れるようになれば、文字列の一部分だけの取り出しや文字列の結合、さらには文字列と数値の変換などができるようになります。 これらの操作は文字列を扱うなら必須のものです。 それでは今回の講座で文字列の操作をマスターしてください。 まず次のソースの内容を実行してください。

'lesson1-3-4
#console
Dim a As String
Dim b As String
Dim c As String
Dim pos As Long
Dim result As Long
Input "足し算の式を入力してください。", a
pos = InStr(1, a, "+")
If pos = 0 Then
result = Val(a)
Else
b = Mid$(a, 1, pos - 1)
c = Mid$(a, pos + 1, Len(a) - pos)
result = Val(b) + Val(c)
End If
Print a + "=" + Str$(result) + "(16進表記:" + Hex$(result) + ")"
Print "計算日時:" + Date$() + " " + Time$()
Sleep(3000)
End

C:\ActiveBasicCourse\lesson1-3-4...
足し算の式を入力してください。12+34
12+34=46(16進表記:2E)

(今回は時刻表示にJavaScriptを使っています。)

今回は入力された式を分解して計算結果を求めるプログラムです。 ただ実行する際に注意していただきたいのは空白などを入れずに詰めて計算式を入力することです。 今回は足し算だけですが、もし興味があればこの講座を読んでいただき、四則演算に対応するものを作ってみてください。 では今回の説明です。

-*-*-*-*-説明-*-*-*-*-

【使い方】
InStr(開始位置 ,検索対象文字列 ,検索文字列 )

【意味】
開始位置 から検索対象文字列 の中の検索文字列 を検索し、戻り値として検索文字列 があった場所(整数型)を返します。

【解説】
文字列内検索(InStr関数)
検索対象文字列 の開始位置 バイト目(最初の文字は1バイト目です)から、検索対象文字列 の中に検索文字列 が含まれるかどうかを検索します。 もし検索文字列 が見つかった場合はその場所を、見つからなかった場合は「0」を戻り値として返します。
ActiveBasicの関数では文字列の場所は最初のバイトを「1バイト目」とする「バイト単位」で表されます。 バイトとは文字を表す最小単位で、半角文字は1バイト、全角文字(いわゆる日本語の文字)は2バイトで構成されています。 例えば"AB講座"という文字列なら、

文字列AB
16進表記41428D758DC0
バイト123456

というふうに構成されます。半角文字の"A","B"は1バイトで、全角文字の"講","座"は2バイトで構成されていますね。
[例] InStr(1, "abc", "b") = 2 ("b"は2バイト目にあるので「2」が返ってきます。)
InStr(1, "abc", "z") = 0 ("z"はないので「0」が返ってきます。)
InStr(2, "abc", "a") = 0 (検索開始が2バイト目からなので1バイト目の"a"は検索されません。よって「0」が返ってきます。)
InStr(1, "abcabc", "a") = 1 (検索文字列 が2つ以上あった場合、最初の方の場所が返ってきます。)
InStr(3, "講座講座", "講") = 5 (検索開始が3バイト目からなので1・2バイト目の部分の"講"は検索されません。よって5バイト目の"講"が引っかかり「5」が返ってきます。全角文字は2バイトということにも注意。)



【使い方】
Val(文字列 )

【意味】
文字列 を数値に変換します。

【解説】
文字列の数字変換(Val関数)
に(数値の)「123」と文字列の"123"は違うということをコラムで書いたと思いますが、でも文字列の"123"を数字の「123」に変えたいと思ったことありませんか? それを可能にするのがその関数です。 文字列 の部分に数字が記録されている文字列(例:"123","-876"など)を書けば、戻り値にその文字列に書かれている数字を「実際の数値」に変えたものが返ってきます。 「実際の数値」とはLong型などの変数に入れることのできるもので、実際に「+」「-」などの演算子で計算ができます。 ちょっと説明が複雑になってきましたが下の例を見ていただければ分かっていただけると思います。
[例] Val ("1") + Val ("1") = 2 (注意:文字列の場合 "1" + "1" = "11"[単なる文字列同士の連結(演算ではない)], ×"2" - "1"[文字列を含むの計算はできない] )

AB3.07現在ではVal関数は小数が扱えません。 小数を引数に渡しても切り捨てされてしまいます。(例: Val("3.07") = 3) 3.08よりVal関数が小数に対応しました。(2004年3月29日追記)



【使い方】
Mid$(対象文字列 ,開始位置 ,取り出し長 )

【意味】
対象文字列 の開始位置 バイト目から取り出し長 バイト分取り出した文字列を戻り値として返します。

【解説】
文字列の一部取り出し(Mid$関数)
これは文字列の中から指定した部分を取り出す関数です。 実際の指定の仕方はまず最初の引数のところに取り出したい文字列が含まれている(もしくは全部)文字列を書きます。変数でも"abc"のようなリテラル値でもOKです。 次の引数には文字列を取り出す最初の場所をバイト単位で書きます。 (最初が「1」バイト目で半角文字を「1バイト」全角文字を「2バイト」として計算します。) そして最後の引数には取り出す長さをまたバイト単位で指定します。 ただしこれは省略しても構いません。 省略した場合は開始位置 から後全部が取り出されます。
[例] Mid$("abcdefg", 3, 2) = "cd"
   Mid$("あいうえお", 5, 4) = "うえ" (全角文字は1文字が「2バイト」です。)
   Mid$("The quick brown fox", 11) = "brown fox" (取り出し長 を省略すると開始位置 の後全てが取得されます。省略するときは直前のコンマも一緒に省略してください。)

※「取り出す」という表現をしていますが、取り出された方の文字列には何の影響もありません。 「取り出し」たからといって対象文字列 の「取り出さ」れた部分が消えるなんてことはありません。



【使い方】
Len(文字列 )

【意味】
文字列 の長さを求めます。(バイト単位)

【解説】
文字列の長さを求める(Len関数)
この関数は文字列 の長さを求める関数です。 戻り値として返される値はバイト単位ということに注意してください。 文字列 の部分は変数でもリテラル値でも構いません。
[例] Len("Active Basic") = 12 (半角スペースは「1」バイトとしてカウントされます。)
   Len("講座") = 4 (全角文字は1文字が「2」バイトです。)



【使い方】
Str$(number )

【意味】
number を文字列に変換します。

【解説】
数値から文字列への変換(Str$関数)
ここでは文字列を連結して表示する部分ですが、にも書いたとおり数値が混ざると連結をすることができません。 そこで数値を文字列に変換する必要があります。 そのときに使うのがこのStr$関数なのです。 機能はVal関数の正反対で、引数で渡された数値を文字列に変換します。
[例] Str$(123) = "123" ()

※Str$関数はAB3.07現在のVal関数と違い小数にも対応しています。


【使い方】
Hex$(10進数 )

【意味】
10進数 を16進数表記に変換します。

【解説】
10進表記から16進表記への変換(Hex$関数)
「10進表記」「16進表記」といきなり言われてもピンとこないかもしれないのでまずこれから解説からします。 「10進表記」は普通に私たちが使っている「123」のような数字の表記方法です。 問題なのは「16進表記」のほうですが、これは一つの桁に0〜9とA〜Fの計16文字を使って数字を表す表現です。 まずそれぞれの文字の対応は次の通りです。

16進表記0123456789ABCDEF
10進表記(いわゆる普通の数字)0123456789101112131415

そして16を超える数字は2つ以上の16進法の数字を使って例えば1A(=26)のように表します。 (下の表を参照)

10進表記(いわゆる普通の数字)1617252627313233159160161255256257
16進表記1011191A1B1F20219FA0A1FF100101

表のように16進法は下位1桁目が0〜Fまであり、Fを超えるときにはその左の桁の数字を1増やし、その左の桁がまたFを超えたときはそのさらに左の桁を1増やし……という具合に数字を表記します。 この16進法はコンピュータ上では頻繁に使われる表記です。 理由はコンピュータのデータがバイト単位(=8ビット=256)で扱われるため1バイトを2桁で表せる16進法(16^2=256)をよく使うのです。 ただどうしても16進法が理解ができないときはWindowsに標準でついている「電卓」(「スタート」→「プログラム」→「アクセサリ」→「電卓」)を使えば簡単に変換できるのでそれを使ってください。

で本題のHex$関数ですが、これに16進数に変換したい10進数を渡せば、その10進数を16進数で表記した文字列が返ってきます。 文字列が返ってくるということに注意してください。

[例] Hex$(123) = "7B"

※小数は変換しようとすると切り捨てされます。負数は複雑なので理由は言いませんがまともな値はでません。



【使い方】
Date$()

【意味】
現在の日付を表す文字列が戻り値として返ってきます。

【解説】
日付の取得(Date$関数)
現在の日付をコンピュータから取得して、yyyy/mm/dd (yyyy:西暦4桁,mm:月2桁,dd:日2桁)という形式の文字列を戻り値として返します。 もし月・日が1桁のときはその頭に"0"がつけられて強制的に2桁の文字列になります。
[例] Date$() = "2004/01/01" (2004年1月1日の場合)
   Date$() = "2003/10/01" (2003年10月1日の場合)


【使い方】
Time$()

【意味】
現在の時刻を表す文字列が戻り値として返ってきます。

【解説】
時刻の取得(Time$関数)
現在の時刻をコンピュータから取得して、hh:mm:ss (hh:時2桁(24時間制),mm:分2桁,ss:秒2桁)という形式の文字列を戻り値として返します。 もし時・分・秒が1桁のときはその頭に"0"がつけられて強制的に2桁の文字列になります。
[例] Time$() = "00:00:00" (0時0分0秒の場合)
   Time$() = "20:08:10" (20時8分10秒の場合)



【16進数の補足】
 ActiveBasicで16進数を数値として扱いたいときは16進数の先頭に&Hをつけます。 こうすることで計算等のときにその数が16進数として扱われます。
[例] &H1A = 26, &H100 = 256, &HA(=10) + &HA = 20

【文字列関数の補足】
 これはActiveBasic3.07現在の話ですが、関数で文字列を渡すところに文字列関数を使うとエラーが出ます。 (例えばVal(Mid$("123", 2, 1))というふうにすることはできません。) AB2.62ではこんなことなかったと思うのですがAB3.x系では今のところそういう仕様みたいです。 なので文字列関数を別のところで使いたいときは一旦結果を別の文字列関数に保存しておき、その文字列を別の関数の文字列を渡すところに使ってください。

今回の内容はどうでしたか? 前回同様大量の関数を紹介してしまいましたが、これらもABプログラミングでは重要な関数がほとんどです。 特にVal関数Str$関数は頻繁に出てくる必須関数です。 ということで今回もしっかりと自分の物にしましょう。 質問・疑問・感想・間違いの指摘は掲示板またはメールでお願いします。 では第三章の最後の「やってみよう」です。

-*-*-*-*- -*-*-*-*-

ユーザに数字を入力してもらい、その数字が左右対称(例えば「12321」など)か調べ、左右対称なら"○○は左右対称です。"、そうでないなら"○○は左右対称ではありません。"と表示するプログラムを作ってみましょう。 但しユーザが入力したのを受ける変数はDWord型を使ってください。
【ヒント】左右対称ということはその数字を逆から並べても元の数字と同じになります。




ご質問・ご意見・ご感想・苦情等はメールまたはメイン掲示板のActiveBasic板などでお気軽にどうぞ。

前に戻る - 次に進む

ホーム > OriosのActiveBasic講座(トップページ) >