从STDIN获取两个数字

时间:2015-02-06 16:47:47

标签: input output racket evaluation

我想从STDIN获取两个数字并将它们的总和打印到STDOUT。以下代码是我的解决方案:

#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. 这是否意味着错误发生是因为Racket尚未初始化?
  2. R是什么意思?
  3. 在错误情况下,为什么第一个输入正确解释为1,但第二个输入错误地解释为R
  4. (我在v6.1.1下运行了球拍Winodws 7 Pro SP1

1 个答案:

答案 0 :(得分:0)

最好使用(read)来读取数字,假设您可以依赖于合理的输入(即,如果它实际上是数字而不是垃圾,或者更糟糕的是,大量的S表达式)。因此,您的代码将是:

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