2015-02-06 68 views
0

我想從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

如下面的圖所示:

example

編輯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:行需要一段時間才能出來。如果我等到行顯示之前我輸入的輸入,程序會表現得如我所料:

example

但是,如果我不直接等待Input:線和類型在我的投入,有時會發生錯誤:

example

所以現在我的問題是:

  1. 這是否意味着錯誤HAPP因爲Racket尚未初始化?
  2. R是什麼意思?
  3. 在錯誤情況下,爲什麼第一個輸入正確解釋爲1,但第二個輸入錯誤地解釋爲R

(我正在拍v6.1.1Winodws 7 Pro SP1

+0

如果你輸入任何不是數字的東西(甚至換行符),你的代碼將會失敗並報告錯誤。 – 2015-02-06 16:49:53

+0

謝謝你,@ÓscarLópez。但是我認爲我的輸入每次都是一樣的,如添加的屏幕截圖所示。 – Ben 2015-02-06 17:03:29

+0

看起來像空白的問題,但它很奇怪,因爲你正在做'串修剪'。對不起,我無法重現問題 – 2015-02-06 17:13:42

回答

0

這是最好用(read)閱讀的數字,假設你可以依靠健全的輸入(即,如果它實際上將是數字,而不是垃圾或,更糟的是,大量的S表達式)。因此你的代碼如下:

(displayln (+ (read) (read))) 
+0

如果我不想要數字而是字符串呢? – cat 2016-04-05 14:03:01