我想对Fortran处理字符串中的“空”字符的方式做一些澄清。 让我们假设我们遇到这种情况:
program main
implicit none
test('AB')
end program
,其中
function test(name)
implicit none
character(10) :: name
character(3) :: cutname
write(*,*) '-'//name//'-' ! Gives output "-AB -"
! Space has then been added at the end
cutname(1:3) = name(1:3)
write(*,*) '1-'//cutname//'-' ! Gives output "-AB -"
! It seems there is a space then at the end
! of cutname
write(*,*) (cutname(1:2) == 'AB') ! Gives output T (true)
write(*,*) (cutname(3:3) == ' ') ! Gives output F (false)
write(*,*) (cutname == 'AB ') ! Gives output F (false)
end function
我很好奇在这种情况下发生了什么。 提前谢谢。
答案 0 :(得分:2)
Fortran中的标准字符串是固定长度。如果你不使用整个字符串,它们会在末尾用空格/空格填充。
我修改了你的示例程序来传递gfortran和ifort的编译器检查。你的函数没有返回,所以作为子程序更好。编译器注意到实际和伪参数的长度之间的不一致 - 因为我将过程放入一个模块并use
编辑它,以便编译器可以检查参数的一致性。他们抱怨将长度为2的字符串传递给长度为10的字符串。如何定义剩余的字符?
module test_mod
contains
subroutine test(name)
implicit none
character(10) :: name
character(3) :: cutname
write(*,*) '-'//name//'-' ! Gives output "-AB -"
! Space has then been added at the end
cutname(1:3) = name(1:3)
write(*,*) '1-'//cutname//'-' ! Gives output "-AB -"
! It seems there is a space then at the end
! of cutname
write(*,*) (cutname(1:2) == 'AB') ! Gives output T (true)
write(*,*) (cutname(3:3) == ' ') ! Gives output F (false)
write(*,*) (cutname == 'AB ') ! Gives output F (false)
end subroutine test
end module test_mod
program main
use test_mod
implicit none
call test('AB ')
end program
当我运行这个版本时,输出是T,T和T,这是我所期望的。
编辑:我建议使用编译器的完整警告和错误检查选项。这就是我快速找到示例问题的方法。使用gfortran:-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace
。
字符串赋值语句不要求双方具有相同的长度。如果RHS短于LHS上的字符串变量,它将在空白处填充。这里,参数应该是一致的,包括长度。