2016-01-05 4 views
1

Вот пример в Python3 того, что я хочу сделать в Fortran:Как объединить две строки в Fortran

str1 = "Hello" 
str2 = " World!" 
print(str1 + str2) 

# And then the result would be "Hello World!" 

Когда я делаю:

print "(A)", str1, str2 

Это ставит его на отдельной строке. Если кто-то знает, как помочь, пожалуйста, ответьте.

ответ

3

Дословный ответ конкатенации, используя оператор //, дается в другой ответ. Обратите внимание, в частности, что вы, вероятно, хотите, чтобы первый аргумент TRIM.

Но есть еще одна интересная концепция, которую поднимает ваш вопрос, и это формат reversion.

В формате (A) у нас есть один элемент формата. В выходном списке str1, str2 у нас есть два выходных элемента. В общем выводе мы применяем каждый элемент формата (с повторными подсчетами) к соответствующему элементу вывода. Итак, str1 обрабатывается с первым элементом формата A, и появляется строка.

Приходите ко второму выходному элементу str2, мы уже использовали элемент одного формата, дойдя до конца списка элементов формата. В результате мы видим эту реверсию формата: то есть мы возвращаемся к первому элементу в списке. После, в решающей степени, мы начинаем новую линию.

Так что, если мы просто хотим, чтобы напечатать эти два элемента в одной строке (без пробела или пустой строки между ними) мы могли бы использовать (без учета подрезки для ясности)

print "(A)", str1//str2 

или мы могли бы использовать формат которая не имеет этого реверсии

print "(2A)", str1, str2 
print "(A, A)", str1, str2 

первые сцепляет две переменные символов, чтобы дать один, больше, который затем печатается в виде отдельного элемента вывода. Второй печатает как по отдельности.

Далее в вашем конкретном примере

character(12), parameter :: str1="Hello" ! Intentionally longer - trailing blanks 
character(12), parameter :: str2=" World!" 

print "(2A)", TRIM(str1), TRIM(str2) 
end 

будет иметь выход как

Hello World! 

с этим средним пространством, потому что TRIM не удалит ведущих пространство от str2. Более широко, хотя у нас не будет ведущего места для нас, и мы хотим добавить его в выход.

Естественно, конкатенация до сих пор работает (я обратно, не предполагающие-подрезка)

character(*), parameter :: str1="Hello" ! No trailing blank 
character(*), parameter :: str2="World!" 

print "(A)", str1//" "//str2 
end 

, но мы можем выбрать наш формат, используя X редактирования дескриптора, чтобы добавить пробел

print "(2(A,1X))", str1, str2 
print "(A,1X,A)", str1, str2 
print "(2(A,:,1X))", str1, str2 

, где этот последний имеет полезный дескриптор двоеточия (вне сферы действия этого ответа).

+0

Спасибо, теперь он печатает на одной строке, но между строками есть большое пространство. Я хочу обрезать все пробелы, за исключением 1. – Prince

+0

Благодарим за помощь. – Prince

1

Похоже, это покрыто, но еще одна полезная функция, если вы хотите напечатать много данных по одной и той же линии заключается в следующем:

character(len=32),dimension(100) :: str  

do i=1,100 
    write(*,fmt="(A)", advance='no') str(i) 
end do 
write(*,*) ! to go to the next line when you are done 

Это будет печатать 100 символов на одной и той же линии, из-за advance = 'no'

+0

Ваш синтаксис для символьной подстроки неверен. Также не забудьте закончить запись в конце. –

+0

Я подозреваю, что он использует массив строк. @MarkS вы должны добавить декларацию для 'str', чтобы уточнить. – agentp

+0

Отредактировано, чтобы оставить меньше ваших фантазий в комментариях –

Смежные вопросы