fortran - 使用延迟长度字符串读取用户输入

标签 fortran

我想以“简单”的方式使用延迟长度的字符串来读取用户输入。我想这样做的原因是我不想在知道用户输入有多大之前必须声明字符串的大小。我知道有“复杂”的方法可以做到这一点。例如,可以使用 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/

相关文章:

compiler-errors - Fortran90 未分类语句 While 循环

c++ - Eigen 在使用显式循环的矩阵乘法中比 Fortran 慢得多

fortran - MPI_Allgather 接收垃圾

c - 对主要 Fortran 程序的 undefined reference

fortran - 将 block 数据 F77 转换为 F90

fortran - gfortran 4.9.0 错误? WHERE 语句被优化掉

arrays - 读取未知形状的多维数组

具有隐式类型的 Fortran SAVE 属性

Fortran 95 : super large numbers for prime test

fortran - 为什么 Fortran 中有一个隐含的 SAVE 属性?