【问题标题】:How to combine two strings in Fortran如何在 Fortran 中合并两个字符串
【发布时间】:2016-01-05 23:16:18
【问题描述】:

这是我想在 Fortran 中执行的 python3 示例:

str1 = "Hello"
str2 = " World!"
print(str1 + str2)

# And then the result would be "Hello World!"

当我这样做时:

print "(A)", str1, str2

它把它放在一个单独的行上。如果有人知道如何提供帮助,请回答。

【问题讨论】:

    标签: printing fortran


    【解决方案1】:

    使用// 运算符的字符串连接的字面答案在另一个答案中给出。请特别注意,您可能希望TRIM 第一个参数。

    但是您的问题提出了另一个有趣的概念,那就是格式还原

    对于(A) 格式,我们有一个格式项。在输出列表str1, str2 中,我们有两个输出项。在一般输出语句中,我们将每个格式项(带有重复计数)应用于相应的输出项。于是,str1被第一个格式项A处理,出现一个字符串。

    来第二个输出项str2 我们已经使用了单个格式项,到达格式项列表的末尾。结果是我们看到了这种格式反转:也就是说,我们回到列表中的第一项。之后,至关重要的是,我们开始新的生产线。

    所以,如果我们只想将这两个项目打印到一行(它们之间没有空格或空行),我们可以使用(为了清楚起见忽略修剪)

    print "(A)", str1//str2
    

    或者我们可以使用没有这种还原的格式

    print "(2A)", str1, str2
    print "(A, A)", str1, str2
    

    第一个连接两个字符变量以给出一个更长的,然后作为单个输出项打印。第二个分别打印。

    来到你的具体例子

    character(12), parameter :: str1="Hello"    ! Intentionally longer - trailing blanks
    character(12), parameter :: str2=" World!"
    
    print "(2A)", TRIM(str1), TRIM(str2)
    end
    

    会有类似的输出

    Hello World!
    

    使用中间空格,因为TRIM 不会从str2 中删除前导 空格。更广泛地说,虽然我们不会在那里为我们提供领先空间,但我们希望将其添加到输出中。

    当然,串联仍然有效(我回到假设不修剪)

    character(*), parameter :: str1="Hello"    ! No trailing blank
    character(*), parameter :: str2="World!"
    
    print "(A)", str1//" "//str2
    end
    

    但是我们可以选择我们的格式,使用X编辑描述符,添加一个空格

    print "(2(A,1X))", str1, str2
    print "(A,1X,A)", str1, str2
    print "(2(A,:,1X))", str1, str2
    

    最后一个有有用的冒号编辑描述符(在这个答案的范围之外)。

    【讨论】:

    • 谢谢,它现在打印在同一行,但字符串之间有很大的空间。我想剪掉除 1 之外的所有空格。
    • 感谢您的帮助。
    【解决方案2】:

    可能接近您想要的: Concatenate two strings in Fortran

    zz = trim(xx) // trim(yy)

    More info

    Bing

    【讨论】:

      【解决方案3】:

      看起来这已经涵盖了,但另一个有用的功能,如果你想在同一行打印大量数据,如下:

      character(len=32),dimension(100) :: str    
      
      do i=1,100
        write(*,fmt="(A)", advance='no') str(i)
      end do
      write(*,*) ! to go to the next line when you are done
      

      这将在同一行打印 100 个字符,因为 Advance='no'

      【讨论】:

      • 您的字符子串语法错误。最后别忘了完成记录。
      • 我怀疑他的意思是使用字符串数组。 @MarkS,您应该添加 str 的声明以澄清。
      • 已编辑,以减少每个 cmets 的想象力
      【解决方案4】:

      您可以使用另一个变量将它们放入其中,并将这两个字符串写入该新变量中:

      Program combineString
          character(len=100) :: text1, text2, text
      
          text1 = "Hello,"
          text2 = "My name is X"
      
          write(text,'(A6, X, A20)') text1, text2
      
          write(*,*) text
      
      End Program
      

      输出是:

      Hello, My name is X  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-12
        • 2019-06-29
        • 2017-10-25
        • 2018-02-14
        • 2015-09-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-13
        相关资源
        最近更新 更多