Fortran supports many operators and intrinsic functions for manipulating strings.
Strings can be concatenated (pasted end-to-end) using the // operator:
module constants integer, parameter :: MAX_NAME_LENGTH=20 end module program string_example ! Variable definitions character(MAX_NAME_LEN) :: first_name, last_name character(MAX_NAME_LEN * 2) :: full_name ! Statements first_name = "Alfred" last_name = "Neumann" full_name = first_name // last_name print *, full_name end program
Output?
One of the most common operations with strings is trimming, or removing the trailing spaces to get just the "meat". Trimming is done with the trim() intrinsic function. Note that we cannot change the maximum size of a string variable. The trim() function allocates a smaller temporary string, whose maximum length is the actual length of its argument.
character(20) :: name name = 'Alfred Nobel' print *, name, ' is the namesake for the Nobel prize.' print *, trim(name), ' is the namesake for the Nobel prize.'
Alfred Nobel is the namesake of the Nobel prize. Alfred Nobel is the namesake of the Nobel prize.
We can use trimming to fix the issue with concatenating names above.
module constants integer, parameter :: MAX_NAME_LENGTH=20 end module program string_example ! Variable definitions character(MAX_NAME_LEN) :: first_name, last_name character(MAX_NAME_LEN * 2) :: full_name ! Statements first_name = "Alfred" last_name = "Neumann" full_name = trim(first_name) // ' ' // trim(last_name) print *, full_name end program
Sometimes we want to know the length of a string. The
len()
and len_trim()
functions return an integer length of the string variable
and the actual content, respectively.
character(20) :: name name = 'Alfred Nobel' print *, len(name) print *, trim_len(name)
20 12
trim_len(string) is equivalent to len(trim(string))
Sometimes we want to extract part of a string. We can simply specify a starting and ending subscript separated by a ':'. If either is ommitted, and a ':' is present, the missing subscript is assumed to be 1 or the maximum subscript for the string.
This syntax can also be used on the left-hand-side of an assignment statement.
character(MAX_NAME_LEN) :: name name = 'Alfred Pennyworth' print *, name(1:6) ! Alfred print *, name(8:17) ! Pennyworth print *, name(:6) ! Alfred print *, name(8:) ! Pennyworth name(8:) = 'E. Neumann" ! name is now 'Alfred E. Neumann'