FORTRANはもともと文字列の扱いをそれほど得意としないが,文字列とはようするに文字の配列であるため,文字列の「配列的な」扱いは,実に上手である.
10文字の文字列a='1234567890'
があるとする.この文字列の任意の部分を取り出すには,配列の場合と全く同じような指定をすればよい.つまり,
a(1:3)
は,'123'
a(:3)
は,'123'
a(3:3)
は,'3'
a(6:8)
は,'678'
a(6:)
は,'67890'
となる.
ただし文字列の場合,a(1:9:2), a(10:1:-1)
などのステップ指定はだめ.残念.
文字列の長さは,変数宣言の時に固定される.さて,そのとき長さの違う文字列を互いに代入したら?
文字列変数aがcharacter*5::a
, 変数bがcharacter*7::b
で宣言されたとする.このとき,
a=b
b=a
a=b(1:5)
b(1:3)=a(2:4)
b(1:3)=a
というふうに,余れば空白,足りなければ切り捨て,どちらにしても左詰め,という原則がある.
文字列をつなげるには演算子「//」を使う.が,これも話は単純ではない.
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の,右側の空白を消去した文字列を作る | 文字列型 |