文字列

FORTRANはもともと文字列の扱いをそれほど得意としないが,文字列とはようするに文字の配列であるため,文字列の「配列的な」扱いは,実に上手である.

部分文字列

10文字の文字列a='1234567890'があるとする.この文字列の任意の部分を取り出すには,配列の場合と全く同じような指定をすればよい.つまり,

となる.

ただし文字列の場合,a(1:9:2), a(10:1:-1)などのステップ指定はだめ.残念.

文字列の長さ

文字列の長さは,変数宣言の時に固定される.さて,そのとき長さの違う文字列を互いに代入したら?

文字列変数aがcharacter*5::a, 変数bがcharacter*7::bで宣言されたとする.このとき,

a=b
bの最初の五文字だけaに代入され,残りは捨てられる
b=a
aが全部bに(左詰めで)入り,余ったところには空白が入る
a=b(1:5)
五文字ちょうどがaに入る
b(1:3)=a(2:4)
三文字ちょうどがbの一文字目から三文字目に入る
b(1:3)=a
aの1〜3文字目がbの1〜3文字目にはいる.

というふうに,余れば空白,足りなければ切り捨て,どちらにしても左詰め,という原則がある.

文字列の結合と余白切り落とし

文字列をつなげるには演算子「//」を使う.が,これも話は単純ではない.

30文字の文字列aに'abc', 5文字の文字列bに'12345'が入っているとする.このとa // bはどんな値になるだろうか?

'abc12345'になって欲しいのである. しかしそうはならない.


&./ex15
 a   =abc
 b   =12345
 a//b=abc                           12345

ごらんのように,aとbの間に空白が入ってしまう.aは30文字として宣言されており,「abd」のあとに27文字の空白が入っている.その空白が全部出てしまうのである.

これを回避するには文字列組み込み関数TRIMを使う.例ex15b


% ./ex15b
 a   =abc
 b   =12345
 a//b=abc12345

組み込み文字列関数

じつは前にも書いたような気がするが再掲する.
名前 意味 返す型
ADJUSTL(s), ADJUSTR(s) 右詰め・左詰め 文字列型
CHAR(i) 文字コードiに対応する文字 integer
ICHAR(s) 文字sの文字コード 文字型
INDEX(s1,s2) 文字列s1の中で文字列s2を探し,最初に現れた先頭位置を返す(なければ0) integer
LEN_TRIM(s), LEN(s) 文字列の,予約されている長さ・実際の(右の空白を除いた)長さ integer
LGE(s1,s2), LGT(s1,s2), LLE(s1,s2), LLT(s1,s2) 文字列s1とs2を比較する.「辞書順」の大小(前後)関係. logical
REPEAT(s,n) 文字列sをn回コピーした文字列 文字列型
SCAN(s1,s2[,BACK]) 文字列s1の中から,文字列s2に含まれる文字を探し,もしあればその位置を返す.なければ0.BACKを.TRUE.(LOGICAL型の「真」を表す値)にすると,後ろから探す. integer
VERIFY(s1,s2[,BACK]) SCANの逆で,s1の中からs2に含まれない文字を探し,その位置を返す.BACKの意味も同じ. integer
TRIM(s) 文字列sの,右側の空白を消去した文字列を作る 文字列型
AGATASHI