2016-12-20 75 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代碼。

列表控制的輸入提供了進一步的挑戰,因爲它有一些可能絆倒您和您的用戶了令人驚訝的功能。

相關問題