Fortran - Strings

A linguagem Fortran pode tratar os caracteres como caracteres únicos ou strings contíguas.

Uma string de caracteres pode ter apenas um caractere de comprimento ou pode até ter comprimento zero. No Fortran, as constantes de caracteres são fornecidas entre um par de aspas duplas ou simples.

O tipo de dados intrínseco characterarmazena caracteres e strings. O comprimento da string pode ser especificado porlen specifier. Se nenhum comprimento for especificado, é 1. Você pode referir-se a caracteres individuais dentro de uma string referindo-se por posição; o caractere mais à esquerda está na posição 1.

Declaração de String

Declarar uma string é igual a outras variáveis ​​-

type-specifier :: variable_name

Por exemplo,

Character(len = 20) :: firstname, surname

você pode atribuir um valor como,

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

O exemplo a seguir demonstra a declaração e o uso do tipo de dados de caractere -

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

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

String Concatenation

O operador de concatenação // concatena strings.

O exemplo a seguir demonstra isso -

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

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

Extraindo substrings

No Fortran, você pode extrair uma substring de uma string indexando a string, fornecendo o índice inicial e final da substring em um par de colchetes. Isso é chamado de especificador de extensão.

O exemplo a seguir mostra como extrair a substring 'world' da string 'hello world' -

program subString

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

World

Exemplo

O exemplo a seguir usa o date_and_timefunção para fornecer a string de data e hora. Usamos especificadores de extensão para extrair as informações de ano, data, mês, hora, minutos e segundos separadamente.

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

Quando você compila e executa o programa acima, ele fornece informações detalhadas de data e hora -

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

Corte de cordas

o trim A função recebe uma string e retorna a string de entrada após remover todos os espaços em branco à direita.

Exemplo

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

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

Ajuste Esquerdo e Direito de Strings

A função adjustl pega uma string e a retorna removendo os espaços em branco à esquerda e acrescentando-os como espaços em branco à direita.

A função adjustr pega uma string e a retorna removendo os espaços em branco à direita e acrescentando-os como espaços em branco à esquerda.

Exemplo

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

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

Procurando por uma substring em uma string

A função de índice pega duas strings e verifica se a segunda string é uma substring da primeira string. Se o segundo argumento for uma substring do primeiro argumento, ele retornará um inteiro que é o índice inicial da segunda string na primeira string, caso contrário, ele retornará zero.

Exemplo

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

test is found at index: 11