【问题标题】:Smalltalk stdin nextLine for fixed number of lines of inputSmalltalk stdin nextLine 用于固定数量的输入行
【发布时间】:2017-05-12 11:17:21
【问题描述】:

我目前正在尝试获取表单的 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 小时的编程、搜索 Internet 等。我是一个超级初学者,自学 Smalltalk,所以我想看看为什么 nextLine 没有正确读取输入。以下是输入标准输入的示例输入,以及 Transcript showinspect 的结果:

标准输入上的示例输入:

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 个输入由 分隔,我认为这是回车或换行。

"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位)。我不知道为什么会这样。

我尝试了nextAvailableflushcommitstdin close 以及其他一些方法,但均无济于事。我的一个想法是解决这个问题是只得到整个stdin contents,除以,然后将每个“部分”保存到3个不同的变量,但我想了解更多关于stdin nextLine如何工作和以便更好地了解这与stdin contents 的关系。鉴于我们知道只有 3 个输入,有没有好办法只执行 stdin nextLine 3 次?

【问题讨论】:

  • 感谢您尝试学习 Smalltalk,但如果您尝试学习这门语言,我不推荐 GNU。考虑尝试PharoVisualWorks 或者 Dolphin 或 Squeak... 在我看来,通过命令行学习 Smalltalk 就像学习如何通过打孔卡制作图形一样。 ;-)

标签: io smalltalk gnu-smalltalk


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我无法在 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 版本?

    【讨论】:

    • 我使用的是 GNU Smalltalk 3.2.4。这是通过 HackerRank,所以可能存在某种类型的问题。
    • 我认为环境设置可能存在问题,无法正确识别输入字节。我将不得不等待得到答复。 COBOL 也有类似的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多