4

我目前正在尝试获取表单的 3 条特定输入行:

XX.XX (float) XX (1-3 位整数) XX (1-3 位整数)

以下是我拥有的当前代码:

inputStringOne := stdin nextLine.
mealCost := inputStringOne.

Transcript show: inputStringOne; cr .

inputStringTwo := stdin nextLine.
tipPercent := inputStringTwo.

Transcript show: inputStringTwo; cr .

inputString := stdin nextLine.
taxPercent := inputString .

mealCost inspect .
tipPercent inspect .
taxPercent inspect .

我已经在这进行了 3-4 小时的编程、搜索互联网等。我是一个超级初学者,自学 Smalltalk,所以我想看看为什么 nextLine 没有正确读取输入。以下是输入标准输入的示例输入,以及成绩单显示检查的结果:

标准输入上的示例输入:

10.25
17
5

标准输出上的输出:

10.25
.25
An instance of String
  contents: [
    [1]: $1
    [2]: $0
    [3]: $.
    [4]: $2
    [5]: $5
  ]
An instance of String
  contents: [
    [1]: $.
    [2]: $2
    [3]: $5
  ]
An instance of String
  contents: [
    [1]: $.
    [2]: $2
    [3]: $5
  ]
10.25

当我只执行以下代码时,我看到所有 3 个输入由 <10> 分隔,我认为这是回车或换行。

"just print all contents in stdin"
inputS := stdin contents.
inputS inspect .

样本输入(标准输入):

10.25
17
5

输出(标准输出):

An instance of String
  contents: [
    [1]: $1
    [2]: $0
    [3]: $.
    [4]: $2
    [5]: $5
    [6]: $<10>
    [7]: $1
    [8]: $7
    [9]: $<10>
    [10]: $5
  ]

所以似乎由于某种原因,代码的第一行是唯一得到的stdin nextLine .,但其余的只得到最后 3 个字符(小数点和小数点后的 2 个数字)。我不确定为什么会这样。

我试过nextAvailable, flush, commit, stdin close, 和其他一些方法,都无济于事。我的一个想法是解决这个问题是只得到整体stdin contents,除以 <10>,然后将每个“部分”保存到 3 个不同的变量,但我想了解更多关于如何stdin nextLine工作并更好地理解这也有关系stdin contentsstdin nextLine鉴于我们知道只有 3 个输入,有没有好的方法只做3 次?

4

2 回答 2

2

这似乎是 GNU smalltalk 中的一个错误。如果您直接从键盘输入输入,则stdin nextLine可以正常工作。但是,如果您从文件重定向输入,则会将其stdin nextLine弄乱。

值得注意的是,我在 HackerRank 中找不到一个用 smalltalk 编写的答案,所以这一定是一个老问题。

于 2018-03-10T04:06:04.910 回答
0

我无法在 macOS 上使用 GNU Smalltalk 3.2.5 重现这一点:

→ gst -f foo.st
12.23
12.23
12
12
7
An instance of String
  contents: [
    [1]: $1
    [2]: $2
    [3]: $.
    [4]: $2
    [5]: $3
  ]
An instance of String
  contents: [
    [1]: $1
    [2]: $2
  ]
An instance of String
  contents: [
    [1]: $7
  ]

如您所见,每个输入都从您的Transcript show:消息中回显,并且输出inspect看起来也正确。您使用的是哪个操作系统和 GNU Smalltalk 版本?

于 2016-12-28T09:03:59.253 回答