我想以“简单”的方式使用延迟长度的字符串来读取用户输入。我想这样做的原因是我不想在知道用户输入有多大之前必须声明字符串的大小。我知道有“复杂”的方法可以做到这一点。例如,可以使用 iso_variing_string 模块:https://www.fortran.com/iso_varying_string.f95 .另外,这里有一个解决方案:Fortran Character Input at Undefined Length .但是,我希望有一些简单或几乎一样简单的东西,如下所示:
program main
character(len = :), allocatable :: my_string
read(*, '(a)') my_string
write(*,'(a)') my_string
print *, allocated(my_string), len(my_string)
end program
当我运行这个程序时,输出是:
./a.out
here is the user input
F 32765
请注意,
write(*,'(a)') my_string
没有输出。 .为什么?另外,
my_string
尚未分配。为什么?为什么这不是 Fortran 的一个简单功能?其他语言有这个简单的功能吗?我一般对这个问题缺乏一些基本的了解吗?
最佳答案
vincentjs 的回答不太正确。
现代(2003+)Fortran 确实允许在赋值时自动分配和重新分配字符串,所以像这样的一系列语句
character(len=:), allocatable :: string
...
string = 'Hello'
write(*,*)
string = 'my friend'
write(*,*)
string = 'Hello '//string
write(*,*)
是正确的,将按预期工作并写出 3 个不同长度的字符串。至少有一个广泛使用的编译器,英特尔 Fortran 编译器,默认情况下不使用 2003 语义,因此在尝试编译时可能会引发错误。有关使用 Fortran 2003 的设置,请参阅文档。
但是,在读取字符串时,此功能不可用,因此您必须采用经过试验和测试(如果您愿意,也可以称为老式)的方法,即为任何输入声明足够大小的缓冲区,然后分配可分配变量。像这样:
character(len=long) :: buffer
character(len=:), allocatable :: string
...
read(*,*) buffer
string = trim(buffer)
不,我不知道为什么语言标准禁止在
read
上自动分配, 就是这样。
关于fortran - 使用延迟长度字符串读取用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31084087/