С оператором вывода
write(*,3) name
мы рассматриваем name
как отдельный элемент передачи, обработанный в формате A3
.Этот формат A3
печатает первые три символа строки.
Дальнейшая обработка, которая преобразует элемент в желаемую форму, невозможна.
Вместо этого мы можем захотеть получитьтри разных предмета передачи.Как и в ответе Владимира 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
Для случая вопросаОтвет Владимира Ф. - лучший подход.В других случаях есть много вариантов.
Поскольку более общий случай вставки пробелов в строку скрывает большую часть тяжелой работы, возможно, будет справедливо дать представление о подходе:
! 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