我想從STDIN中獲取兩個數字並將它們的總和打印到STDOUT。下面的代碼是我的解決方案:從STDIN中獲取兩個數字
#lang racket
(displayln (+ (string->number (string-trim (read-line)))
(string->number (string-trim (read-line)))))
如果輸入
1
2
有時輸出3
如預期,但有時輸出是:
+: contract violation
expected: number?
given: #f
argument position: 1st
other arguments...:
2
context...:
sum.rkt: [running body]
這是爲什麼?
編輯1
如下面的圖所示:
編輯2
我寫了下面的代碼來探索我的程序的行爲:
#lang racket
(displayln "Input:")
(define s1 (string-trim (read-line)))
(define s2 (string-trim (read-line)))
(displayln "Output:")
(displayln (string->list s1))
(displayln (string->list s2))
(define n1 (string->number (string-trim s1)))
(define n2 (string->number (string-trim s2)))
(displayln n1)
(displayln n2)
(displayln (+ n1 n2))
我的電腦很慢,所以Input:
行需要一段時間才能出來。如果我等到行顯示之前我輸入的輸入,程序會表現得如我所料:
但是,如果我不直接等待Input:
線和類型在我的投入,有時會發生錯誤:
所以現在我的問題是:
- 這是否意味着錯誤HAPP因爲Racket尚未初始化?
R
是什麼意思?- 在錯誤情況下,爲什麼第一個輸入正確解釋爲
1
,但第二個輸入錯誤地解釋爲R
?
(我正在拍v6.1.1
下Winodws 7 Pro SP1
)
如果你輸入任何不是數字的東西(甚至換行符),你的代碼將會失敗並報告錯誤。 – 2015-02-06 16:49:53
謝謝你,@ÓscarLópez。但是我認爲我的輸入每次都是一樣的,如添加的屏幕截圖所示。 – Ben 2015-02-06 17:03:29
看起來像空白的問題,但它很奇怪,因爲你正在做'串修剪'。對不起,我無法重現問題 – 2015-02-06 17:13:42