如何在luajit中使用strtok?

时间:2014-06-04 07:15:35

标签: lua strtok luajit

我的代码如下:

local ffi = require "ffi"
local ffi_C = ffi.C
local ffi_typeof = ffi.typeof
local ffi_new = ffi.new
local ffi_string = ffi.string
local NULL = ngx.null
local tostring = tostring

ffi.cdef[[
    char * strtok(char * str, const char * delimiters);
]]

local p_char_type = ffi_typeof("char[?]")

function split(src, c)
    local result = {}

    local pch = ffi_new(p_char_type, 1)
    local psrc = ffi_new(p_char_type, #src)
    local pc = ffi_new(p_char_type, #c)

    ffi.copy(psrc, src)
    ffi.copy(pc, c)
    pch = ffi_C.strtok(psrc, pc)

    while pch do
        table.insert(result, ffi_string(pch))
        pch = ffi_C.strtok(NULL, pc)
        ngx.log(ngx.ERR, "pch ok")
    end

    ngx.log(ngx.ERR, "split ok")

    return result
end

当我运行我的nginx时,发生了一些错误! 在通过while循环返回之后,nginx工作进程与信号11一起崩溃。 最后一个ngx.log无法运行。 我该如何处理?

1 个答案:

答案 0 :(得分:1)

local psrc = ffi_new(p_char_type, #src)
ffi.copy(psrc, src)

ffi.copy给定字符串源时也复制一个空终止符,但是你的数组太小而无法容纳它,导致溢出。

此外,请考虑使用Lua模式,而不是使用strtok。它们更安全,更易于使用,并且不依赖于FFI。