在Fortran中输出时在字符串中添加空格

时间:2019-03-28 16:43:18

标签: fortran fortran90

我想在字符串中添加空白。例如:name是等于"abcxyzdefg"的变量。

现在,我想将此字符串打印为:abc xyz defg

我用了这个程序

program name_space
    implicit none
    character(len=30) :: name = "abcxyzdefg"

    write(*,3) name
    3 format (A3, 2X, A3, 2X, A4)

end program

我想要输出为:

abc xyz defg

但是,我通过这种方式得到了

abc

2 个答案:

答案 0 :(得分:2)

您必须引用适当的子字符串

write(*,3) name(1:3), name(4:6), name(7:)

只需执行write(*,'(A3,1X,A3,...)') name,第一个描述符将打印name的前三个字符,然后输出列表完成,不再有要打印的项目,因此write语句终止。

答案 1 :(得分:2)

带有输出语句

write(*,3) name

我们将name视为单个转移项,并以A3格式处理。这种A3格式会打印字符串的前三个字符。

没有可以将物品转换为所需形式的进一步处理。

相反,我们可能想要三个不同的转移项目。一种方法就像在answer by Vladimir F中一样,使用单个子字符串:

write(*,3) name(1:3), name(4:6), name(7:10)
write(*,3) (name(i:i+2), i=1,4,3), name(7:)  ! Can use implied do if desired

我们还可以通过某种方式拆分名称以获得数组(如果元素的长度与我们知道的相同)。作为数组,每个元素形成一个单独的输出项:

write(*,3) TRANSFER(name, 'aaa', 3)
write(*,'(3A4)') split_into_chunks_of_4(name)

或者我们可以转换字符串以添加空格,然后输出:

write(*,'(A)') split_into_chunks(name)  ! for some suitable function

对于这个问题,弗拉基米尔F的答案是最好的方法。在其他情况下,还有很多选择。


在更普遍的情况下,在字符串中插入空格隐藏了很多艰苦的工作,因此,给出一种方法的指示也许是公平的:

! Add spaces to a string str at the breakpoints bps
function split(str, bps)
  character(*), intent(in) :: str
  integer, intent(in) :: bps(:)
  character(LEN(str)+SIZE(bps)) :: split
  integer i
  split=''
  split(1:bps(1)-1) = str(1:bps(1)-1)
  do i=1, SIZE(bps)-1
    split(bps(i)+i:bps(i+1)-1+i) = str(bps(i):bps(i+1))
  end do
  split(bps(i)+SIZE(bps):) = str(bps(i):)
end function