我遇到一个错误,说我的 'for' 限制不是一个数字,即使我没有引用那个变量

基本上我正在编写一个程序(为学校),其中用户输入几个球的体积,使用一个公式需要获得直径,然后查看直径是否过大。但是其中一个变量应该是球的名称,这样我就可以在输出中引用它(例如:你给我一个乒乓球,最大直径为2厘米。然后你给我运行程序的球的数量,3。然后你给了3个体积,1.5、2.5和2 -- 输出1.5 - 乒乓球,2.5 - 不是乒乓球,2 - 乒乓球)但无论何时我运行我的程序并输入我的球的名称,我都会收到一个错误,说我的“for”限制不是一个数字,即使我没有引用那个变量而是引用另一个变量。

local n = io.read("*n")  -- 球的数量
for getal1 = 1, n do
  local naam_Bal = io.read() -- 如果我输入一个字符串,这里会出现错误
  local av = io.read("*n")  -- 每种球的体积数
  local gewenste_Diameter = io.read("*n")  -- 最大直径
  local volume
  local diameter
  for getal2 = 1, av do
    volume = io.read("*n")   -- 每个球的体积
    diameter = 2 * (((3/4)*(volume/math.pi)) ^ (1/3))  -- 计算直径的公式
    print(diameter)
  end
end

这可能是一个愚蠢的错误,但我真的卡住了。

点赞
用户14864687
用户14864687

io.read('*n') 看起来表现奇怪。 在5.1.5和5.4.2中均需要我按两次回车键。这种行为解释了为什么输入字符串时会出现错误。之前读取数字的操作尚未完成。我建议不要使用它,而是使用像这样的函数来输入数字以避开此问题。

function input_number()
    var line = io.read()
    var num = tonumber(line)
    if not num then
        error("not a number")
    end
end

您可能想改进基本的错误处理。

2021-02-19 15:54:42
用户1847592
用户1847592

这是因为 io.read("*n") 会留下(数字后面的)EOL 未读取。

在你的脚本中实际发生的情况是:

  • local n = io.read("*n") 读取数字但不读取 EOL。
  • local naam_Bal = io.read() 读取了之前数字的 EOL,但没有读取名称。
  • local av = io.read("*n") 读取了名称。

解决方案:

如果你有每个数字都在单独的输入行上,

你应该总是使用 io.read("*n", "*l") 而不是 io.read("*n")

2021-02-19 15:59:07