gt4f90ioリファレンスマニュアル - 手続名のリスト

文字列操作 (dc_string モジュール)

2004/12/04 森川靖大


概要

dc_string は文字列を操作するためのサブルーチン群を持つモジュールです。

書式

文字型を整数型に変換

integer function StoI(string, default) result(result)
    character(len = *), intent(in)           :: string
    integer,            intent(in), optional :: default
end function

string で与えられる文字型変数を、整数型変数にして返します。 もしも string が数値に変換できない場合、default が返ります。 default を指定しない場合は 0 が返ります。

文字型を倍精度実数型に変換

 double precision function StoD(string) result(result)
    character(len = *), intent(in):: string
end function

string で与えられる文字型変数を、倍精度実数型変数にして返します。 もしも string が数値に変換できない場合、0.0 が返ります。

文字型を整数型配列、単精度実数型配列、倍精度実数型配列に変換

subroutine Get_Array(int_ptr, string)
    integer, pointer               :: int_ptr(:)
    character(len = *), intent(in) :: string
end subroutine

string で与えられる文字型変数をカンマ「,」で区切り、 整数型配列ポインタ int_ptr(:) にして返します。 int_ptr(:) はポインタになっているので、配列サイズは string の内容に応じて自動的に決まります。

subroutine Get_Array(real_ptr, string)
    real, pointer                  :: real_ptr(:)
    character(len = *), intent(in) :: string
end subroutine

string で与えられる文字型変数をカンマ「,」で区切り、 単精度実数型配列ポインタ real_ptr(:) にして返します。 real_ptr(:) はポインタになっているので、配列サイズは string の内容に応じて自動的に決まります。

subroutine Get_Array(real_ptr, string)
    double precision, pointer      :: real_ptr(:)
    character(len = *), intent(in) :: string
end subroutine

string で与えられる文字型変数をカンマ「,」で区切り、 倍精度実数型配列ポインタ real_ptr(:) にして返します。 real_ptr(:) はポインタになっているので、配列サイズは string の内容に応じて自動的に決まります。

文字型を論理型に変換

logical function Stor_to_Logical(string) result(result)
    character(len = *), intent(in)  :: string
end function

string で与えられる文字型変数を論理型にして返します。 string が、 空、 または 00.00.0D00.0d0.false..FALSE.fFfalseFALSE の場合には .false. が返ります。 それ以外の場合には .true. が返ります。

数値型を文字型に変換

character(32) function toChar(i) result(result)
    integer,          intent(in) :: i
end function

character(500) function toChar(ibuf) result(result)
    integer,          intent(in) :: ibuf(:)
end function

character(32) function toChar(x) result(result)
    real,             intent(in) :: x
end function

character(500) function toChar(rbuf) result(result)
    real,             intent(in) :: rbuf(:)
end function

character(32) function toChar(d) result(result)
    double precision, intent(in) :: d
end function

character(500) function toChar(dbuf) result(result)
    double precision, intent(in) :: dbuf(:)
end function

整数型変数 i 、整数型配列 ibuf(:) 、 単精度実数型変数 x 、単精度実数型配列 rbuf(:) 、 倍精度実数型変数 d 、倍精度実数型配列 dbuf(:) で与えられる数値を文字型変数にして返します。 配列が与えられる場合、各要素をカンマと空白「, 」 で区切って返します。

文字型配列の連結

character(string) function JoinChar(carray, expr) result(result)
    character(*)     , intent(in)           :: carray(:)
    character(*)     , intent(in), optional :: expr
end function

文字型配列 carray に与えた複数の文字列を「, 」 で区切った1つの文字列にして返します。 expr に文字列を与えると、その文字列を区切り文字として用います。

オフセットした文字列の重複探査 (Index 関数の拡張版)

integer function Index_Ofs(string, start, substr) result(result)
    character(len = *), intent(in) :: string
    integer,            intent(in) :: start
    character(len = *), intent(in) :: substr
end function

文字列 string の start 文字目以降の文字列の中に substr の文字列が 含まれている時、その開始文字位置を返します。 含まれない場合は 0 を返します。 返される開始文字位置は文字列 string の先頭から数えます。

文字列置換

function Replace(string, from, to) result(result)
    character(len = 500)           :: result
    character(len = *), intent(in) :: string, from, to
end function

文字列 string に文字列 from が含まれる場合、その部分を文字列 to に置換して返します。文字列 from が含まれない場合は string をそのまま返します。 from が複数含まれる場合、先頭の from のみが置換されます。

文字列を大文字へ変換 (サブルーチン)

subroutine toUpper(ch)
    character(len = *), intent(inout):: ch
end subroutine

文字列 ch に英字が含まれる場合、その英字を大文字に変換して ch に返します。 英字でない文字や既に大文字になっている文字はそのまま返します。

文字列を大文字へ変換 (関数)

character(string) function UChar(ch) result(result)
    character(len = *), intent(in):: ch
end function UChar

文字列 ch に英字が含まれる場合、その英字を大文字に変換して返します。 英字でない文字や既に大文字になっている文字はそのまま返します。

文字列を小文字へ変換 (サブルーチン)

subroutine toLower(ch)
    character(len = *), intent(inout):: ch
end subroutine

文字列 ch に英字が含まれる場合、その英字を小文字に変換して ch に返します。 英字でない文字や既に小文字になっている文字はそのまま返します。

文字列を小文字へ変換 (関数)

character(string) function LChar(ch) result(result)
    character(len = *), intent(in):: ch
end function LChar

文字列 ch に英字が含まれる場合、その英字を小文字に変換して返します。 英字でない文字や既に小文字になっている文字はそのまま返します。

文字列の比較 (大文字小文字を無視)

logical function StriEq(string_a, string_b) result(result)
        character(len = *), intent(in):: string_a
        character(len = *), intent(in):: string_b
end function

文字列 string_a と文字列 string_b を比較し、同じものならば .true. を、異なる場合には .false. を返します。 ただし、この関数は英字の大文字、小文字を同じ文字として処理します。

文字列の比較 (先頭部分のみの比較)

logical function StrHead(whole, head) result(result)
        character(len = *), intent(in):: whole
        character(len = *), intent(in):: head
end function

文字列 head と文字列 whole の先頭部分 (head と同じ文字列長) とを比較し、同じものならば .true. を、異なる場合には .false. を返します。 whole の文字列長が head の文字列長よりも短い場合には .false. を返します。

データを整形して文字列として返す

function CPrintf(fmt, i, r, d, L, s, n, c1, c2, c3) result(result)
    character(len = string)                :: result
    character(*),     intent(in)           :: fmt
    integer,          intent(in), optional :: i(:), n(:)
    real,             intent(in), optional :: r(:)
    double precision, intent(in), optional :: d(:)
    logical,          intent(in), optional :: L(:)
    type(VSTRING),    intent(in), optional :: s(:)
    character(*),     intent(in), optional :: c1, c2, c3
end function

フォーマット文字列 fmt に従って文字列を返します。 第1引数 fmt は「"」で囲まれ、 その中に出力したい文字列と後続する引数のフォーマット指定を書きます。 フォーマット指定には「%」を用います。 フォーマット指定したものについては、 その1つ1つについて対応する引数がなくてはなりません。 以下に、フォーマット指定子と引数の対応を記します。

フォーマット指定子 対応する引数 出力形式 表示桁数や形式
%d%D i(:) 整数データ (10 進数) 20 桁
%o%O i(:) 8 進数データ 20 桁
%x%X i(:) 16 進数データ 20 桁
%f%F d(:) 倍精度実数データ 全桁数 80、小数部の桁数 40
%r%R r(:) 単精度実数データ 全桁数 80、小数部の桁数 40
%b%B L(:) 論理データ 真:T、偽:F
%y%Y L(:) 論理データ 真:yes、偽:no
%s%S s(:) VSTRINGデータ  
%c%C c1c2c3 文字データ  

文字データ以外は、1つの型のデータをいくつでも与えることが可能です。 文字データは c1c2c3 にそれぞれ1つづつの文字データしか与えることができません。

また、フォーマット指定子として「%*」を与えることで、 複数のデータを一度に出力することも可能です。 その場合、いくつのデータを一度に出力するかを n(:) に与える必要があります。

以下に、CPrintf を用いた出力の例を紹介しておきます。

use gt4f90io
use dc_types,  only: string
use dc_string, only: CPrintf
character(len = string) :: output, color="RED", size="Large"
integer, parameter      :: n1 = 2, n2 = 3
integer                 :: int = 10, arrayI1(n1), arrayI2(n2), i
real                    :: arrayR(n1)
logical                 :: eq

do, i = 1, n1
   arrayI1(i) = 123 * i
   arrayR(i)  = 1.23 * i
enddo
do, i = 1, n2
   arrayI2(i) = 345 * i
enddo
eq = (maxval(arrayI1) == minval(arrayI2))
output = CPrintf(fmt="color=%c size=%c int=%d I1=%*d I2=%*d R=%*r equal=%y", &
     & c1=trim(color), c2=trim(size), i=(/int, arrayI1, arrayI2/), &
     & r=(/arrayR/), L=(/eq/), n=(/n1, n2, n1/))

write(*,*) trim(output)

文字データ以外のものは基本的に1次元配列しか引数にとれないため、 多次元配列を出力したい場合には組込み関数である pack 関数を 用いると良いでしょう。以下にその例を記します。

use gt4f90io
use dc_types,  only: string
use dc_string, only: CPrintf
character(len = string) :: output
integer                 :: i,j,k
integer, parameter      :: n1 = 2, n2 = 3, n3 = 4
real                    :: array(n1,n2,n3)

do, i = 1, n1
   do, j = 1, n2 
      do, k = 1, n3
         array(i,j,k) = i * 0.1 + j * 1.0 + k * 10.0
      enddo
   enddo
enddo
output = CPrintf('array=<%*r>', &
     & r=(/pack(array(:,:,:), .true.)/), n=(/size(array(:,:,:))/))
write(*,*) trim(output)

データを整形して出力

subroutine Printf(unit, fmt, i, r, d, L, s, n, c1, c2, c3)
    character(*),     intent(out)          :: unit
    character(*),     intent(in)           :: fmt
    integer,          intent(in), optional :: i(:), n(:)
    real,             intent(in), optional :: r(:)
    double precision, intent(in), optional :: d(:)
    logical,          intent(in), optional :: L(:)
    type(VSTRING),    intent(in), optional :: s(:)
    character(*),     intent(in), optional :: c1, c2, c3
end subroutine

subroutine Printf(unit, fmt, i, r, d, L, s, n, c1, c2, c3)
    integer,          intent(in), optional :: unit
    character(*),     intent(in)           :: fmt
    integer,          intent(in), optional :: i(:), n(:)
    real,             intent(in), optional :: r(:)
    double precision, intent(in), optional :: d(:)
    logical,          intent(in), optional :: L(:)
    type(VSTRING),    intent(in), optional :: s(:)
    character(*),     intent(in), optional :: c1, c2, c3
end subroutine

フォーマット文字列 fmt に従って文字列を返します。 (1) 引数 unit に文字型を与えた場合、 文字列は unit に返され、 (2) 引数 unit に整数型を与えた場合、 装置番号 unit に対して文字列が出力されます。 整数型で用いようとする場合は unit は省略可能で、 その場合には文字列は標準出力に出力されます。 フォーマット文字列 fmt の書式に関しては CPrintfを参照してください。 以下に Printf を用いた出力の例を紹介しておきます。

use gt4f90io
use dc_types,  only: string
use dc_string, only: Printf
character(len = string) :: output, color="RED", size="Large"
integer, parameter      :: n1 = 2, n2 = 3
integer                 :: int = 10, arrayI1(n1), arrayI2(n2), i
real                    :: arrayR(n1)
logical                 :: eq

do, i = 1, n1
   arrayI1(i) = 123 * i
   arrayR(i)  = 1.23 * i
enddo
do, i = 1, n2
   arrayI2(i) = 345 * i
enddo
eq = (maxval(arrayI1) == minval(arrayI2))

! 装置番号 6 (標準出力) に直接出力する場合
call Printf(unit=6, &
     & fmt="color=%c size=%c int=%d I1=%*d I2=%*d R=%*r equal=%y", &
     & c1=trim(color), c2=trim(size), i=(/int, arrayI1, arrayI2/), &
     & r=(/arrayR/), L=(/eq/), n=(/n1, n2, n1/))

! 文字列 output に渡す場合
call Printf(unit=output, &
     & fmt="color=%c size=%c int=%d I1=%*d I2=%*d R=%*r equal=%y", &
     & c1=trim(color), c2=trim(size), i=(/int, arrayI1, arrayI2/), &
     & r=(/arrayR/), L=(/eq/), n=(/n1, n2, n1/))
write(*,*) trim(output)