2014-09-21 205 views
1

我需要用戶在出現提示時只輸入實數。如果用戶輸入字符或任何其他符號,則應顯示錯誤消息並停止程序。我如何在Fortran 77中做到這一點。Fortran77用戶輸入驗證

回答

0

我認爲,您可能想要嘗試更多嘗試,因爲您的問題在編譯器中會自動執行。可以使用IOSTAT=ERR=說明符。

INTEGER IE 
    DO I = 1, MAX 
    READ(*,*,IOSTAT=IE) X 
    IF (IE.eq.0) GOTO 10 
    PRINT *,"Wrong input, try again." 
    END DO 
10 CONTINUE 

GOTO 10 
20 PRINT *,"Wrong input, try again." 
10 READ(*,*,ERR=20) X 
+0

如果您關心錯誤,請不要使用列表控制輸入。編譯器沒有義務通過iostat報告「不良」輸入。唯一健壯和便攜的方法是自己滾動驗證。 – IanH 2014-09-22 10:15:53

+0

我不能同意。從單個記錄來看,它是相當好的。 – 2014-09-22 10:17:32

+0

輸入斜線作爲輸入。走着瞧吧。 – IanH 2014-09-22 10:18:02

0

提高用戶界面的話,我想讀一個字符串,然後執行錯誤檢查在內部讀取:

character insting*80 
    ie=1 
    do while(ie.ne.0) 
    read(*,'(a)')instring 
    if(instring(1:1).eq.'q')stop 
    read(instring,*,iostat=ie)x 
    if(ie.ne.0)then 
     write(*,*)'invalid input ',trim(instring),' is not a real number' 
    endif 
    enddo 

(注意trim是不f77順便說一句,但它很容易複製,如果需要)

請注意,有一些努力,你可以處理pathalogic案例。領先「/」或「」沒有拋出錯誤,但葉X不變(可能是系統/編譯器相關的但是!)的值,這樣你就可以做這樣的事情:

 x=-999999. 
    read(instring,*,iostat=ie)x 
    if(ie.eq.0.and.x.eq.-999999.)then 
      .. code to handle error.. 
    endif 

你可以交替使用index來尋找壞人物。在我的系統上,十進制.本身被視爲零。這有點麻煩,但可以通過解析instring

+0

用輸入',ListDirectedInputCanBeEvil'試試你的程序,它通常不被認爲是有效的真實文本。 – IanH 2014-09-22 13:14:02

+0

@IanH你建議哪種格式優雅地處理用戶鍵入整數的情況? – agentp 2014-09-22 14:44:28

+0

任何數字編輯描述符,可用於實數輸入(F,E,D,G),其描述符的小數部分爲.0,字段寬度指定與輸入的字段寬度匹配,假定解釋整數字面是一個真正的「優美」。但是,如果您確實想驗證輸入文本是否匹配某種特定的「真實文字樣」模式,那麼您幾乎必須自己做這件事 - 對Fortran處理器檢測「不良」輸入沒有任何要求。 – IanH 2014-09-22 22:54:58