防止在输入字符而不是数字时关闭FORTRAN
我有一个read语句,它需要一个数字,非常简单的示例代码:防止在输入字符而不是数字时关闭FORTRAN,fortran,gfortran,Fortran,Gfortran,我有一个read语句,它需要一个数字,非常简单的示例代码: program test integer var read(*,*) var end PROGRAM test CHARACTER(len=100) :: input LOGICAL :: is_numeric, success INTEGER :: var DO READ(*,*) :: input IF (is_numeric(input)) THEN READ(input,*) var success = .TRUE
program test
integer var
read(*,*) var
end
PROGRAM test
CHARACTER(len=100) :: input
LOGICAL :: is_numeric, success
INTEGER :: var
DO
READ(*,*) :: input
IF (is_numeric(input)) THEN
READ(input,*) var
success = .TRUE.
ELSE
WRITE(*,*) 'ERROR: Input is not numeric.'
END IF
IF (success) THEN
break
END IF
END DO
END PROGRAM test
LOGICAL FUNCTION is_numeric(string)
IMPLICIT NONE
CHARACTER(len=*), INTENT(IN) :: string
LOGICAL :: is_numeric
INTEGER :: var
INTEGER :: error_val
READ(string,*,IOSTAT=error_val) x ! This line converts string to an integer
! If there was an error, the error_val variable is
! non-zero
is_numeric = error_val==0
END FUNCTION is_numeric
问题是,由于分心,我通常会输入一串字符(即:是)。如何防止代码完全停止,而显示输入错误值类型的错误消息。再试一次
我的想法是:
program test
integer var
10 read(*,*) var
if (var.not.a.number) then
write(*,*)'You've entered an incorrect value. Try again'
goto 10
endif
end
那var.not.a.number情况会是什么样子?
我使用gfortran
在Ubuntu下编译
编辑:谢谢大家!我最终实现了HPM的第三个选项,因为它是最简单的选项:
program test
integer var,iostat,ios
10 read(*,*,iostat=ios) var
if (ios.ne.0) then
write(*,*)'You've entered an incorrect value. Try again'
goto 10
endif
end
特别感谢
User7391
为编写所有代码付出的努力 也许您可以将值读入字符变量,然后相应地处理该字符变量
如果它只包含数字,则将其存储在var中,否则,报告错误并循环
检查字符是否只有数字,请考虑此示例代码:
program test
integer var
read(*,*) var
end
PROGRAM test
CHARACTER(len=100) :: input
LOGICAL :: is_numeric, success
INTEGER :: var
DO
READ(*,*) :: input
IF (is_numeric(input)) THEN
READ(input,*) var
success = .TRUE.
ELSE
WRITE(*,*) 'ERROR: Input is not numeric.'
END IF
IF (success) THEN
break
END IF
END DO
END PROGRAM test
LOGICAL FUNCTION is_numeric(string)
IMPLICIT NONE
CHARACTER(len=*), INTENT(IN) :: string
LOGICAL :: is_numeric
INTEGER :: var
INTEGER :: error_val
READ(string,*,IOSTAT=error_val) x ! This line converts string to an integer
! If there was an error, the error_val variable is
! non-zero
is_numeric = error_val==0
END FUNCTION is_numeric
如果您在编写示例代码方面需要帮助,请告诉我
您需要能够将字符转换为整数。这可以通过内部读/写语句实现。使用旧FORTRAN:
90 continue
read (*, *, err=90) number
这可以做得更详细,您可以测试错误并输出错误消息。您使用的是列表定向输入。语句read(*,*)
中的第二个*
本质上告诉编译器/运行时系统,您将在运行时为它提供可以解释为整数的内容。如果你想给自己在输入上犯错误的自由,你有(至少)3个选择
正如@User7391的答案所说,您可以将输入读入字符变量,然后自己解析它。那个善良的用户甚至愿意为你写代码李>
您可以将read命令修改为类似于read(*,*,err=1234)
的内容,其中1234
是错误处理语句的标签。这种方法现在被认为相当过时,可能会遭到反对
您可以将read命令修改为类似于read(*,*,iostat=ios)
的内容,其中ios
是一个整数变量,它捕获read
语句报告的iostat
(i/o状态标志)。然后,您可以编写行if(iostat/=0).
以进行错误处理。这被认为是最新的方法
注意,使用这种方法,您可以进一步处理输入字符串,例如允许“端到端”输入。