Добавить пробел в строку при выводе в Фортран - PullRequest
2 голосов
/ 28 марта 2019

Я хочу добавить пробел в строку.Например: 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 ]

2 голосов
/ 28 марта 2019

С оператором вывода

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
2 голосов
/ 28 марта 2019

Вы должны ссылаться на соответствующие подстроки

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

, просто выполнив write(*,'(A3,1X,A3,...)') name первый дескриптор печатает первые три символа name, а затем список вывода заканчивается, больше нет элементовбыть напечатанным, поэтому оператор записи завершается.

...