我想在字符串中添加空格。例如: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
您必须参考相应的子字符串
write(*,3) name(1:3), name(4:6), name(7:)
只需执行write(*,'(A3,1X,A3,...)') name
第一个描述符打印name
的前三个字符,然后输出列表完成,没有更多的项目要打印,因此write语句终止。
用输出语句
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