2016-12-20 39 views
0

我想写一个简单的程序来计算一个函数与Fortran95/03需要作为输入一个数字(x)和获取作为输出数字(y)。 用户输入是real :: input和读取调用看起来像如何检查用户输入是否适合变量?

read (*,*, iostat=stat) input 
if(stat > 0) then 
    print *, "False input, use numbers!" 

的iostat的帮我检查,如果输入的是一个数字或字母。

我的问题是,如果我输入一个非常大的数字,如1000000000000,该程序崩溃与错误消息“bufferoverflow”。我知道我可以使真正的大于4字节的变量,但我也可以使输入数字更大,所以这并不能解决问题。

主要问题是,是否有可能通过用户输入来防止程序崩溃?

+0

你是说即使'iostat ='给出程序也会终止吗?虽然接下来的问题不是对这个问题的回答,但是你不能仅仅以“1.5e903”的形式给出输入,而不是让人难以置信的长'15000000000000000000000 ... 0'? – francescalus

回答

1

检查用户输入的值是一种非常基本的技术,必须在与其他人进行交互的各种软件中使用,而不仅仅是作者。它用于所有编程语言。

您可以只使用一个简单的条件

if (input > input_max) then 
    print *, "Input value too large, try again" 
    cycle ! or return stop or set some flag or whatever 
end if 

不要忘记值可能也太小了!

了解崩溃来自何处非常重要。它当然不是来自于输入大数字,而是以不好的方式使用数字,例如,分配太大的数组或者通过计算触发浮点异常。

1

将输入读取为字符串,然后验证字符串输入,然后使用内部读取将验证的字符串转换为REAL。

存在处理器相关的行为,输入和输出的许多方面,作为一般原则,如果你想的鲁棒性,那么你需要做太多的腿部的工作你自己。例如,如果提供了一个真实的格式错误的输入,则不要求处理器将其识别为错误条件并返回一个非零的IOSTAT代码。

列表控制的输入提供了进一步的挑战,因为它有一些可能绊倒您和您的用户了令人惊讶的功能。

相关问题