Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Lua:根据接收到的符号数捕获字符串_String_Loops_Lua - Fatal编程技术网

String Lua:根据接收到的符号数捕获字符串

String Lua:根据接收到的符号数捕获字符串,string,loops,lua,String,Loops,Lua,我目前有一个字符串,它可以是任意长度,基于一个或两个特定位置的单个数字(基于捕获的第一个数字)。例如: 已更改 捕获的第一个数字告诉我是否要跟在文件名后面:“1”=后面是对象名。“0”=捕获的下一个输入是长度乘数。 并非总是收到“1”。但始终收到“0” 使用“1”捕获时,看起来如下所示: START |(1)|图形名称|(0)|(#)|输入|输入|输入|。。。etc 带有“0”(未捕获“1”) START |(0)|(#)输入|输入|输入|输入|。。。etc 长度乘数位(始终跟随“0”)是要跟

我目前有一个字符串,它可以是任意长度,基于一个或两个特定位置的单个数字(基于捕获的第一个数字)。例如:

已更改


捕获的第一个数字告诉我是否要跟在文件名后面:“1”=后面是对象名。“0”=捕获的下一个输入是长度乘数。 并非总是收到“1”。但始终收到“0”

使用“1”捕获时,看起来如下所示:
START |(1)|图形名称|(0)|(#)|输入|输入|输入|。。。etc

带有“0”(未捕获“1”)
START |(0)|(#)输入|输入|输入|输入|。。。etc

长度乘数位(始终跟随“0”)是要跟随的输入组数。“组”是一组4x
输入。因此,如果它是一个“4”,我想完全捕获的字符串如下所示:

`INPUT`
`INPUT|INPUT`
`INPUT|INPUT|INPUT`
`INPUT|INPUT|INPUT|5`
`INPUT|INPUT|INPUT|5|INPUT`
`INPUT|INPUT|INPUT|5|INPUT|INPUT` etc
用“1”表示:
START|(1)|图形名称|(0)|(4)|输入|输入|输入|输入|输入|输入|输入|输入|输入|输入|输入|输入|输入|输入|输入|

用“0”表示:
START |(0)|(4)|输入|输入|输入|输入|输入|输入|输入|输入|输入|输入|输入|输入|输入|


当接收到每个输入时,将在后面添加管道符号。我想使用管道根据数字监控输入的长度。例如,如果数字为
5
,它将捕获3x
输入
5
,然后是5x
输入
(包括所有管道)。完成此操作后,该函数会将完全捕获的字符串发送给其他函数以供使用

我在计算接收函数以捕获完整字符串时遇到问题。我曾尝试计算不同循环函数中的管道数量,所有这些都会导致错误

尝试包括(请理解我对这一切都很陌生):


这是我尝试过的两个例子。我删除了其他徒劳的尝试,以获取准确的字符串长度。我目前的问题是,它在接收到每个字符串时捕获
输入
,并在捕获整个字符串之前将其发送到下一个函数。因此,如果我在顶部收到字符串,它将如下所示:

`INPUT`
`INPUT|INPUT`
`INPUT|INPUT|INPUT`
`INPUT|INPUT|INPUT|5`
`INPUT|INPUT|INPUT|5|INPUT`
`INPUT|INPUT|INPUT|5|INPUT|INPUT` etc
直到最后收到以下字符串:

`INPUT|INPUT|INPUT|5|INPUT|INPUT|INPUT|INPUT|INPUT|`
此时,我的文件按它应该的方式运行。但在这一点之前,我得到了错误,因为函数的参数没有完全满足

理想情况下,在继续之前,我需要最后一个字符串

任何想法都将受到欢迎和赞赏

干杯

ETA:这些
输入
正在填充缓冲区。我希望该校验位负责仅在满足长度值时使用的字符串。再次,我真的很感谢所有的投入。多谢各位


ETA:尝试了示例代码和更多输入细节。

Lua中的所有字符串都是内部化的,因此将字符串推送到数组上通常比重复重建同一字符串更好。本例从stdin中逐行获取输入。3个数据输入,后跟一个数字,后跟该数字的数据输入。有很多其他方法可以做到这一点,但这很容易遵循

local buffer = {}
function process_input(input)
    if #buffer == 3 then
        input = tonumber(input)
    end

    table.insert(buffer,input)

    if #buffer > 4 and #buffer == buffer[4] + 4 then
       local pipe_delim = table.concat(buffer,'|')
       buffer = {}
       return pipe_delim
    end
end

repeat
    local input = io.read()

    local pipe_delim = process_input( input )
    if pipe_delim then
       print('Got:', pipe_delim)
    end
until false

@Bengrim我希望这能澄清一点?@Bengrim每个输入本身就是一个字符串;各种数据,包括字母数字字符。每个输入都被输入到一个缓冲区中,该缓冲区与管道除味器连接在一起。这将继续构建,直到缓冲区成为我稍后可以使用的最终字符串。我不知道我是否含糊不清。请让我知道。@Bengrim在我原来的帖子中更新了一些更具体的例子。并非总是收到“1”。但是“0”总是向下发送,后面跟着一个“长度乘数”。“长度乘数”乘以“4”,这将导致在乘数之后需要捕获的输入总数。谢谢!在检查和操作代码以满足我的需要时,我完全忘记了我的输入中的一个细节,我必须在上面分享和更改它。如果您不想修改您的答案以包含该信息,我理解。我会试着看看我是否能自己动手。我想我知道你要去哪里。我只需要包括缓冲区是否等于许多位置等,但非常感谢!!!我已经更新了示例以显示我的意思。我希望它能让您或其他成员足够清楚,并为我的问题提供另一种解决方案,我的代码可以以此为基础。再次感谢您到目前为止的输入。您的更新基本上是自己编写的:-)只需添加几个变量来保留状态,并在每个处理过程中引用它们。Hmmm。。。。你能举例说明你的意思吗?您的意思是我必须声明变量,以按接收顺序表示每个输入吗?如果是这样的话,您将如何根据“长度乘数”处理输入序列?不,您只需要有变量来标记您在处理序列中的位置,这样当您的代码接收到下一个输入时,它就可以决定如何处理它。这只是一个编程的问题——在纸上完成这个过程并仔细思考。i、 e.我是否仍在输入的序言中?是的:我上次得了“1”分吗?如果是这样,做这个,否则做那个;否:收集输入,直到达到先前找到的计数。
local buffer = {}
function process_input(input)
    if #buffer == 3 then
        input = tonumber(input)
    end

    table.insert(buffer,input)

    if #buffer > 4 and #buffer == buffer[4] + 4 then
       local pipe_delim = table.concat(buffer,'|')
       buffer = {}
       return pipe_delim
    end
end

repeat
    local input = io.read()

    local pipe_delim = process_input( input )
    if pipe_delim then
       print('Got:', pipe_delim)
    end
until false