【问题标题】:How do I print a Fortran string with quotes around it?如何打印带有引号的 Fortran 字符串?
【发布时间】:2021-08-11 22:59:15
【问题描述】:

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

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

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

【问题讨论】:

  • “准确地看到前导和尾随空格”是什么意思?你真的需要古老的 Fortran 77 吗?为什么在地球上?
  • 我需要查看一些与问题无关且与问题无关的调试目的的空格。如果需要,我可以混入 Fortran90。
  • 这是一个完全不同的问题。问题不在于引号之间的差异,而是将其转义为某个字符以通过手动计数来查看其长度
  • 这个问题本质上是“我如何打印引号字符?”。为字符定界在引号和撇号之间做出决定的主要原因之一正是为了允许“漂亮”地打印引号。
  • 不,这与漂亮的报价无关。这可以通过"'" 完成。

标签: fortran


【解决方案1】:

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

这意味着您必须自己显式打印任何选择的分隔符,将它们添加到格式中或像Vladimir F's answer 那样连接。

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

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

您甚至可以编写一个返回“分隔字符串”的函数并使用 结果是输出列表:

  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 在评论中提醒我们的那样,格式化输出的连接具有 分隔符模式,它允许将引号和撇号自动添加到 list-directed 和 namelist 的输出中输出(仅限)。例如,我们可以控制特定数据传输语句的分隔符模式:

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 不允许以这种方式任意选择分隔符,但这仍然适用于某些用途。

【讨论】:

  • Fortran 是否会有可变长度的字符串,这将允许在这种情况下不必必须预先指定字符串长度。语句delimited = delim//str//delim 应该足以让编译器知道delimited 的长度。
  • @JAlex Fortran 多年来一直使用延迟长度字符串。
  • @JAlex, character(:), allocatable :: delimited 适合。
  • 通过使用分隔符选项重新打开标准输出单元,可以引用列表导向的字符输出。使用,内在 :: iso_fortran_env open(unit=output_unit, delim='quote') print *, 'hello'
  • @yamajun,我忽略了列表导向的输出,但这当然值得一提,谢谢。
【解决方案2】:

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

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

或具有相同的效果

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

(francescalus 也提到)在字符串之前和之后打印 ' 字符,

或者你可以用这些字符连接你的字符串并打印结果

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

【讨论】:

    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2016-07-17
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    相关资源
    最近更新 更多