2013-03-07 70 views
0

當我實現與ocaml的(見下文)read_int功能,爲什麼「%d」在OCaml scanf格式中是錯誤的?

let read_int() = Scanf.bscanf Scanf.Scanning.stdin "%d" (fun x -> x) 

如果格式參數爲%d(無空格),編譯器將返回失敗以下信息:

Exception: 
Scanf.Scan_failure 
"scanf: bad input at char number 1: ``character '\\n' is not a decimal digit''". 

但如果我使用' '%d(帶空格的前綴),那很好,爲什麼%d是錯誤的? %d' '%d之間的區別是什麼? 。謝謝。

回答

3

scanf格式"%d"匹配一串十進制數字。這不包括空白。在scanf格式字符串中,空格(" ")代表任意數量的空格(空格,製表符,換行符)。

真的不可能確切地說出發生了什麼,因爲我不知道程序的標準輸入中出現了什麼。問題可能出現在前一行末尾的'\n'

更新:爲什麼它的價值,我決定很久以前(在我的C編程日)scanf導致更多的問題比它解決。這在處理投入方面尤其糟糕。最好用另一種方法將輸入分爲多行,並在產生的字符串上使用sscanf(或int_of_string)。

+0

非常感謝您,我認爲我們應該始終使用「%d」而不是「%d」來防止潛在的錯誤。 – 2013-03-07 07:35:22

+1

我個人傾向於完全避免使用scanf,並進行真正的lexing(即ocamllex之類的)。該代碼通常變得更容易理解,操縱,擴展,並且不應該比手動調試慢得多。 – didierc 2013-03-07 17:04:01

+0

當然,我傾向於使用'scanf'來進行快速測試,我打算稍後扔掉。有一個'printf'的反例是一個好主意,但它在實踐中出人意料的糟糕。 – 2013-03-07 17:12:26

相關問題