以下代码读取未指定长度的用户输入字符串。请注意,它需要一个支持延迟长度字符串的编译器:character(len = :)
. Fortran 2003 中引入了延迟长度字符串。
program test
use iso_fortran_env, only : IOSTAT_EOR
implicit none
integer :: io_number
character(len = 1) :: buffer
character(len = :), allocatable :: input, output
input = ""
print *, "Please input your message."
do
read(unit = *, fmt = '(a)', advance = "no", iostat = io_number) buffer
select case (io_number)
case(0)
input = input // buffer
case(IOSTAT_EOR)
exit
end select
end do
allocate(character(len=(len(input))) :: output)
! Now use "input" and "output" with the ciphering subroutine/function.
end program test
解释
这个想法是在寻找记录结束(eor)条件的同时一次读取一个字符。eor 条件是由用户按下“return”键引起的。“iostat”选项可用于查找 eor。“iostat”返回的值等于位于模块“iso_fortran_env”中的整数常量“IOSTAT_EOR”:
use iso_fortran_env, only : IOSTAT_EOR
我们声明一个延迟长度的字符串来获取未知长度的用户输入:
character(len = :), allocatable :: input
在“read”语句中,“advance = 'no'”允许一次读入几个字符。“缓冲区”的大小决定了要读取的字符数(在我们的例子中为 1)。
read(unit = *, fmt = '(a)', advance = "no", iostat = io_number) buffer
如果“iostat”返回“0”,则没有错误,也没有 eor。在这种情况下,应将“缓冲区”字符添加到“输入”字符串中。最终,这一步分配了一个“新”输入,其大小等于“旧”输入 + 缓冲区字符的大小。新分配的输入包含来自旧输入的字符 + 缓冲区字符。
select case (io_number)
case(0)
input = input // buffer
如果“iostat”返回一个 eor 值,则退出 do 循环。
case(IOSTAT_EOR)
exit