Smalltalk stdin nextLine用于固定数量的输入行

时间:2016-12-28 07:40:17

标签: io smalltalk gnu-smalltalk

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

XX.XX(浮动) 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没有正确读取输入。以下是放入stdin的示例输入,以及成绩单显示检查的结果:

stdin上的示例输入:

10.25
17
5

stdout输出:

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 .

示例输入(stdin):

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位) )。我不确定为什么会这样。

我尝试了nextAvailableflushcommitstdin close以及其他一些方法,但都无济于事。我有一个想法是解决这个问题就是得到整个stdin contents,除以&lt; 10&gt;,然后将每个“部分”保存到3个不同的变量,但我想了解更多关于如何{{ 1}}工作并更好地理解它与stdin nextLine的关系。鉴于我们知道只有3个输入,没有好的方法可以做stdin contents 3次吗?

2 个答案:

答案 0 :(得分:0)

我无法在使用GNU Smalltalk 3.2.5的macOS上重现这个:

→ 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版本?

答案 1 :(得分:0)

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

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