如何打印带有引号的 Fortran 字符串?

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

假设我有一个如下所示的 Fortran 程序:

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

我想打印带引号的字符串,以便我可以准确地看到前导空格和尾随空格。如何做到这一点?

您可以在字符串周围打印引号。这将启用查看前导和尾随空格。

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

或效果相同

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

(也被 francescalus 提到)在你的字符串之前和之后打印一个 ' 字符,

或者您可以将您的字符串与这些字符连接起来并打印结果

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

没有字符的编辑描述符将它们与分隔符一起输出。字符变量没有像文字字符常量中出现的那样的“自动”定界符(尽管可能将它们作为内容)。

这意味着您必须自己显式打印任何选定的定界符,将它们添加到格式中或像 中那样连接。

同样,您也可以将分隔符添加到输出列表中(使用 相应的格式更改):

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

您甚至可以编写一个 returns “定界字符串”的函数,并使用 结果在输出列表中:

  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

上面的函数结果甚至可以是延迟长度(character(:), allocatable :: delimited)以避免显式声明结果长度。


正如 yamajun 在评论中提醒我们的那样,格式化输出的连接具有 定界符模式 ,它允许将引号和撇号自动添加到 [=35] 的输出中=]列表定向和名单输出(仅限)。例如,我们可以控制特定数据传输语句的分隔符模式:

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

或者对于整个连接:

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

不要忘记,列表定向输出会将前导空白添加到您的输出中,如果您的字符输出项中有引号或撇号,您将不会看到完全相同的表示(这甚至可能是您想要):

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

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

end

Fortran 2018 不允许以这种方式选择任意分隔符,但这仍然适用于某些用途。