Lua中使用io.read创建Table出现异常的问题求助
Lua io.read 创建Table时的输入异常问题解析
问题描述
想要用Lua的io.read创建一个Table,代码如下:
local members = {} io.write("How many members you wanna add? ") local memberNum = io.read("n") print("Add new member: ") for i = 1, memberNum do local newMember = io.read("*l") if i == 1 then members[1] = newMember else table.insert(members, i, newMember) end end for i = 1, #members do print(i, ": ", members[i]) end
预期结果:
members = { "Amir", "Hamid", "Bahar", "Emad", "Maryam"}
实际运行时,程序只接收4次输入,且第一个元素为空值,得到的结果是:
members = {"", "Amir", "Hamid", "Bahar", "Emad"}
问题原因
- 第一个元素为空的原因:使用
io.read("n")读取数字时,只会提取输入中的数字部分,输入时按下的换行符会留在输入缓冲区中。后续第一次调用io.read("*l")时,会直接读取这个剩余的换行符,导致第一个元素为空字符串。 - 输入次数少一次的原因:因为第一次
io.read("*l")读取了空内容,后续循环中实际只读取了memberNum-1次有效输入,所以看起来少了一次输入。另外,代码中table.insert(members, i, newMember)的写法多余且易出错——当i>=2时,直接赋值members[i] = newMember即可,指定位置插入反而会打乱数组逻辑。
修复方案
方案1:清空数字输入后的缓冲区
在读取完数字后,额外调用一次io.read("*l")消耗剩余的换行符,再开始读取成员名称:
local members = {} io.write("How many members you wanna add? ") local memberNum = io.read("n") io.read("*l") -- 清空数字输入后的换行符 print("Add new member: ") for i = 1, memberNum do local newMember = io.read("*l") members[i] = newMember -- 直接赋值,无需判断i是否为1 end for i = 1, #members do print(i, ": ", members[i]) end
方案2:统一读取整行再处理
用io.read()读取数字所在的整行,再转换为数字,避免残留换行符:
local members = {} io.write("How many members you wanna add? ") local memberNum = tonumber(io.read()) -- 读取整行再转数字 print("Add new member: ") for i = 1, memberNum do local newMember = io.read("*l") table.insert(members, newMember) -- 直接在数组末尾添加元素 end for i = 1, #members do print(i, ": ", members[i]) end
验证结果
修复后,输入5次成员名称,会得到预期的Table:
members = { "Amir", "Hamid", "Bahar", "Emad", "Maryam"}
内容的提问来源于stack exchange,提问作者M3gan3_sama
相关产品推荐
相关产品推荐

