gpt4 book ai didi

fortran - 编写很长的字符串时,Fortran 中的自动换行符

转载 作者:行者123 更新时间:2023-12-05 00:13:38 24 4
gpt4 key购买 nike

我在 fortran 中有一个字符串,我在循环中扩展:

character(:), allocatable :: string
...
do i = 1, n
string = string // "some stuff depending on i"
end do

只要字符串小于 80 个字符,就可以正常工作。当达到 80 个字符时,字符串中会包含一个换行符。

有谁知道为什么会发生这种情况以及是否有机会避免这种情况?

我有以下完整示例:
program string

implicit none

character(:), allocatable :: long_string
character(:), allocatable :: line

integer :: i
character(8) :: idx

line = " This is line number: "

long_string = "First line" // NEW_LINE('A')

do i = 1, 3
write(idx, "(I8)") i
long_string = long_string // line // adjustl(trim(idx)) // NEW_LINE('A')
end do

write(*,*) long_string

end program

如果我使用 Intel 的 Fortran 编译器进行编译,则会得到以下输出:
 First line
This is line number: 1
This is line number: 2
This
is line number: 3

使用 gfortran 给出了预期的输出:
 First line
This is line number: 1
This is line number: 2
This is line number: 3

最佳答案

正如您所注意到的,列表导向的输出将在开始新行之前自动打印最多 80 个字符:

character(len=:), allocatable :: a
a = "************************** This is an 84-character string **************************"
print *, a

! This is the output:
************************** This is an 84-character string ****************
*****

请注意,80 个字符的限制包括所有打印和非打印字符,包括使用列表导向输出时自动插入的前导空格。我看了看,但我不知道是否有方法可以更改此默认行为,或者它是否由 Fortran 标准或其他标准指定。

为了完整起见,我将演示我在说什么。处理这个问题的最好方法是定义一种格式,正如之前的答案中已经建议的那样。您可以非常轻松地对字符串执行此操作:
! print everything in the string:
print "(a)", a
! output:
************************** This is an 84-character string **************************

! or, define the printed field width:
print "(a34)", a
! output:
************************** This is

等等。

更新:我已经查看了您添加到原始帖子中的代码。请注意,在您创建后 long_string在 DO 循环中,字符串长度超过 80 个字符。当您使用列表导向输出进行打印时,ifort 的结果是有意义的:任何超过 80 个字符(包括前导空格和换行符)的内容将自动在新行上继续。

请注意,当您使用 adjustl(trim(idx)) 时您仍然会得到一个 8 个字符长的字段。我想你的意思是使用 trim(adjustl(idx)) .如果你这样做,并且仍然使用列表导向的输出来写 long_string ,那么输出看起来像:
First line
This is line number: 1
This is line number: 2
This is line number
: 3

所以,你会在输出的末尾再次得到那个额外的“意外”行,因为 long_string 的长度超过 80 个字符。幸运的是,解决方案是(再次)只使用字符格式 "(a)" .由于您已将换行符放置在所需位置,因此您将获得所需的输出。

关于fortran - 编写很长的字符串时,Fortran 中的自动换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48326131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com