我有一些代码
::redo::
io.write("input: ")
var = io.read("*n")
if var then
if var > 5 and var < 10 then io.write("yes\n") goto redo
else io.write("invalid\n") goto redo end
else io.write("invalid\n") goto redo end
应该检查数字输入值并返回它是否在一定范围内。如果不是数字值,则应该“重做”脚本并再次要求输入。问题是,只要输入的内容不是数字,就会不断重复io.write("input: ")
和io.write("invalid\n")
,这意味着它会跳过var = io.read("*n")
行。 io.read("*n")
是否有特殊含义或怪异之处,可避免重新评估?如果将代码替换为io.read()
答案 0 :(得分:0)
当您呼叫io.read('*n')
并且找不到数字时,它不会用完输入,并且对io.read('*n')
的任何调用都会一遍又一遍读取相同的输入。您需要吃掉输入并通过调用io.read('*l')
放弃它。这样一来,您就可以使用io.read('*n')
阅读新输入。
另一种方法是使用io.read('*l')
读取一行,使用string.match
从其中提取一个数字,然后使用tonumber
将其转换为数字。然后,您不必两次读取相同的输入,但是您必须决定要匹配的数字符号类型。 (io.read('*n')
接受各种类型的数字,包括十六进制和科学计数法。)