我目前正在尝试获取表单的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位) )。我不确定为什么会这样。
我尝试了nextAvailable
,flush
,commit
,stdin close
以及其他一些方法,但都无济于事。我有一个想法是解决这个问题就是得到整个stdin contents
,除以&lt; 10&gt;,然后将每个“部分”保存到3个不同的变量,但我想了解更多关于如何{{ 1}}工作并更好地理解它与stdin nextLine
的关系。鉴于我们知道只有3个输入,没有好的方法可以做stdin contents
3次吗?
答案 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编写的单一答案,所以这一定是个老问题。