我有一个read语句,需要一个非常简单的示例代码:
program test
integer var
read(*,*) var
end
事情是我通常会因为分心而输入一串字符(即:是)。如何防止我的代码完全停止,而是显示类型的错误消息您输入的值不正确。再试一次?
我在想:
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
努力编写所有代码!
答案 0 :(得分:5)
您正在使用列表导向的输入。语句*
中的第二个read(*,*)
实质上告诉编译器/运行时系统,您将在运行时为其提供一些可以解释为integer
的内容。如果你想给自己输入错误的自由,你有(至少)3个选择。
read(*,*,err=1234)
的内容,其中1234
是错误处理语句的标签。这种方法现在被认为是相当老套的,可能会不受欢迎。read(*,*,iostat=ios)
,其中ios
是一个整数变量,用于捕获iostat
报告的read
(i / o状态标志)声明。然后,您可以编写行if (iostat/=0) ...
以进行错误处理。这被认为是最新的方法。答案 1 :(得分:4)
也许您可以将值读入字符变量,然后相应地处理该字符变量。
如果它只包含数字,则将其存储在var中,否则报告错误并循环回来。
要检查某个字符是否只是数字,请考虑以下示例代码:
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
如果您需要帮助编写示例代码,请告诉我。
您需要能够将字符转换为整数。内部读/写语句可以实现这一点。
答案 2 :(得分:3)
使用旧的FORTRAN:
90 continue
read (*, *, err=90) number
这可以更详细,您可以测试错误并输出错误消息。