Fortran-strings

提供:Dev Guides
移動先:案内検索

Fortran-ストリング

Fortran言語では、文字を単一の文字または連続した文字列として扱うことができます。

文字列の長さは1文字のみの場合もあれば、長さがゼロの場合もあります。 Fortranでは、文字定数は二重引用符または単一引用符のペアの間に指定されます。

組み込みデータ型 character は、文字と文字列を格納します。 文字列の長さは* len指定子*で指定できます。 長さを指定しない場合、1です。 位置によって参照する文字列内の個々の文字を参照できます。左端の文字は位置1です。

文字列宣言

文字列を宣言することは他の変数と同じです-

type-specifier :: variable_name

例えば、

Character(len = 20) :: firstname, surname

次のような値を割り当てることができます

character (len = 40) :: name
name = “Zara Ali”

次の例は、文字データ型の宣言と使用を示しています-

program hello
implicit none

   character(len = 15) :: surname, firstname
   character(len = 6) :: title
   character(len = 25)::greetings

   title = 'Mr.'
   firstname = 'Rowan'
   surname = 'Atkinson'
   greetings = 'A big hello from Mr. Beans'

   print *, 'Here is', title, firstname, surname
   print *, greetings

end program hello

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Here isMr.   Rowan          Atkinson
A big hello from Mr. Bean

文字列連結

連結演算子//は、文字列を連結します。

次の例はこれを示しています-

program hello
implicit none

   character(len = 15) :: surname, firstname
   character(len = 6) :: title
   character(len = 40):: name
   character(len = 25)::greetings

   title = 'Mr.'
   firstname = 'Rowan'
   surname = 'Atkinson'

   name = title//firstname//surname
   greetings = 'A big hello from Mr. Beans'

   print *, 'Here is', name
   print *, greetings

end program hello

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Here is Mr. Rowan Atkinson
A big hello from Mr. Bean

部分文字列の抽出

Fortranでは、文字列にインデックスを付けて、文字列から部分文字列を抽出し、部分文字列の開始インデックスと終了インデックスを1組の角かっこで指定できます。 これはエクステント指定子と呼ばれます。

次の例は、文字列「hello world」から部分文字列「world」を抽出する方法を示しています-

program subString

   character(len = 11)::hello
   hello = "Hello World"
   print*, hello(7:11)

end program subString

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

World

次の例では、 date_and_time 関数を使用して、日付と時刻の文字列を指定します。 範囲指定子を使用して、年、日付、月、時間、分、および秒の情報を個別に抽出します。

program  datetime
implicit none

   character(len = 8) :: dateinfo ! ccyymmdd
   character(len = 4) :: year, month*2, day*2

   character(len = 10) :: timeinfo ! hhmmss.sss
   character(len = 2)  :: hour, minute, second*6

   call  date_and_time(dateinfo, timeinfo)

   !  let’s break dateinfo into year, month and day.
   !  dateinfo has a form of ccyymmdd, where cc = century, yy = year
   !  mm = month and dd = day

   year  = dateinfo(1:4)
   month = dateinfo(5:6)
   day   = dateinfo(7:8)

   print*, 'Date String:', dateinfo
   print*, 'Year:', year
   print *,'Month:', month
   print *,'Day:', day

   !  let’s break timeinfo into hour, minute and second.
   !  timeinfo has a form of hhmmss.sss, where h = hour, m = minute
   !  and s = second

   hour   = timeinfo(1:2)
   minute = timeinfo(3:4)
   second = timeinfo(5:10)

   print*, 'Time String:', timeinfo
   print*, 'Hour:', hour
   print*, 'Minute:', minute
   print*, 'Second:', second

end program  datetime

上記のプログラムをコンパイルして実行すると、詳細な日時情報が得られます-

Date String: 20140803
Year: 2014
Month: 08
Day: 03
Time String: 075835.466
Hour: 07
Minute: 58
Second: 35.466

ストリングのトリミング

*trim* 関数は文字列を取り、すべての後続ブランクを削除した後に入力文字列を返します。

program trimString
implicit none

   character (len = *), parameter :: fname="Susanne", sname="Rizwan"
   character (len = 20) :: fullname

   fullname = fname//" "//sname !concatenating the strings

   print*,fullname,", the beautiful dancer from the east!"
   print*,trim(fullname),", the beautiful dancer from the east!"

end program trimString

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Susanne Rizwan      , the beautiful dancer from the east!
 Susanne Rizwan, the beautiful dancer from the east!

弦の左右調整

関数 adjustl は文字列を取得し、先頭の空白を削除して末尾の空白として追加することで返します。

関数 adjustr は文字列を受け取り、末尾の空白を削除して先頭の空白として追加することでそれを返します。

program hello
implicit none

   character(len = 15) :: surname, firstname
   character(len = 6) :: title
   character(len = 40):: name
   character(len = 25):: greetings

   title = 'Mr. '
   firstname = 'Rowan'
   surname = 'Atkinson'
   greetings = 'A big hello from Mr. Beans'

   name = adjustl(title)//adjustl(firstname)//adjustl(surname)
   print *, 'Here is', name
   print *, greetings

   name = adjustr(title)//adjustr(firstname)//adjustr(surname)
   print *, 'Here is', name
   print *, greetings

   name = trim(title)//trim(firstname)//trim(surname)
   print *, 'Here is', name
   print *, greetings

end program hello

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Here is Mr. Rowan  Atkinson
A big hello from Mr. Bean
Here is Mr. Rowan Atkinson
A big hello from Mr. Bean
Here is Mr.RowanAtkinson
A big hello from Mr. Bean

文字列内の部分文字列を検索する

インデックス関数は2つの文字列を取り、2番目の文字列が最初の文字列の部分文字列かどうかを確認します。 2番目の引数が最初の引数の部分文字列の場合、最初の文字列の2番目の文字列の開始インデックスである整数を返します。それ以外の場合はゼロを返します。

program hello
implicit none

   character(len=30) :: myString
   character(len=10) :: testString

   myString = 'This is a test'
   testString = 'test'

   if(index(myString, testString) == 0)then
      print *, 'test is not found'
   else
      print *, 'test is found at index: ', index(myString, testString)
   end if

end program hello

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

test is found at index: 11