wander95
wander95

Reputation: 1366

How do I print a Fortran string with quotes around it?

Suppose I have a Fortran program like the following:

      character*30 changed_string1
      changed_string1="hello"
      write(*,"(A)")changed_string1(1:3)
      end

I would like to print the string with quotes so that I can exactly see leading and trailing spaces. How to do this?

Upvotes: 2

Views: 1524

Answers (2)

francescalus
francescalus

Reputation: 32431

There is no edit descriptor for characters which outputs them along with delimiters. A character variable does not have "automatic" delimiters like those which appear in a literal character constant (although may have them as content).

Which means you have to explicitly print any chosen delimiter yourself, adding them to the format or concatenating as in Vladimir F's answer.

Similarly, you can also add the delimiters to the output list (with corresponding format change):

write (*,'(3A)') '"', string, '"'

You can even write a function which returns a "delimited string" and use the result in the output list:

  implicit none

  character(50) :: string="hello"
  print '(A)', delimit(string,'"')

contains

  pure function delimit(str, delim) result(delimited)
    character(*), intent(in) :: str, delim
    character(len(str)+2*len(delim)) delimited

    delimited = delim//str//delim
  end function delimit

end program

The function result above could even be deferred length (character(:), allocatable :: delimited) to avoid the explicit statement of result length.


As yamajun reminds us in a comment, a connection for formatted output has a delimiter mode, which does allow quotes and apostrophes to be added automatically to the output for list-directed and namelist output (only). For example, we can control the delimiter mode for a particular data transfer statement:

write(*, *, delim='quote') string
write(*, *, delim='apostrophe') string

or for the connection as a whole:

open(unit=output_unit, delim='quote')  ! output_unit from module iso_fortan_env

Don't forget that list-directed output will add that leading blank to your output, and if you have quotes or apostrophes in your character output item you will not see exactly the same representation (this could even be what you want):

use, intrinsic :: iso_fortran_env, only : output_unit
open(output_unit, delim='apostrophe')

print*, "Don't be surprised by this output"

end

Fortran 2018 doesn't allow arbitrary delimiter choice in this way, but this could still be suitable for some uses.

Upvotes: 7

You can print quotes around your string. That will enable see the leading and trailing spaces.

write(*,"('''',A,'''')") changed_string1

or with the same effect

write(*,"(3A)") "'",changed_string1,"'"

(also mentioned by francescalus) that print a ' character before and afgter your string,

or you can concatenate your string with these characters and print the result

write(*,"(A)") "'"//changed_string1//"'"

Upvotes: 4

Related Questions