我正在尝试遍历Lua中的表并输出:

  • 每个表的键。
  • 每个表中每个条目的键/值对。

  • 这是代码:
    void print_table(lua_State *L)
    {
        lua_pushnil(L);
        while(lua_next(L, -2) != 0) {
        const char *key = lua_tostring(L, -2);
                if(lua_isstring(L, -1))
                    printf("%s = %s", key, lua_tostring(L, -1));
                else if(lua_isnumber(L, -1))
                    printf("%s = %d", key, lua_tonumber(L, -1));
                else if(lua_istable(L, -1)) {
                    printf("%s", key);
                    PrintTable(L);
                }
                lua_pop(L, 1);
            }
        }
    }
    

    这是我尝试输出的表之一的示例:
    s = {
            p = {
                n = "D",
                g = "1",
            },
            d = {
                l = "N",
                p = "N",
                u = "O",
                po = 100,
            },
            e = {
                {
                    n = "B",
                    l = "P",
                    p = "P",
                    u = "P",
                    po = "P",
                    pa = {
                        v = "4",
                        a = "U",
                        f = {
                            { name = "U", type = "U" },
                            { name = "A", type = "I" },
                            { name = "A", type = "I" },
                            { name = "P", type = "U" },
                            { name = "P", type = "U" },
                            { name = "P", type = "I" },
                            { name = "T", type = "U" },
                            { name = "D", type = "U" },
                            { name = "D", type = "I" },
                            { name = "S", type = "I" },
                            { name = "C", type = "U" },
                            { name = "G", type = "U" },
                            { name = "C", type = "F" },
                            { name = "C", type = "U" },
                        },
                    },
                    c = {
                        v = "1",
                        a = "",
                        f = {
                            { name = "B", type = "U" },
                            { name = "E", type = "F" },
                        },
                    },
                },
            },
        }
    

    该函数在行中崩溃:
    while(lua_next(L, -2) != 0)
    

    由于索引无效。导致崩溃的脚本行是:
    { name = "B", type = "U" },
    

    我不得不承认我对Lua中的堆栈不是很熟悉,我尝试搜索类似的答案,但找不到任何答案。有人知道我在做什么错吗?

    谢谢!

    添加了工作版本,以防任何人感兴趣:
    void print_table(lua_State *L)
        {
            if ((lua_type(L, -2) == LUA_TSTRING))
                printf("%s", lua_tostring(L, -2));
    
            lua_pushnil(L);
            while(lua_next(L, -2) != 0) {
                if(lua_isstring(L, -1))
                    printf("%s = %s", lua_tostring(L, -2), lua_tostring(L, -1));
                else if(lua_isnumber(L, -1))
                    printf("%s = %d", lua_tostring(L, -2), lua_tonumber(L, -1));
                else if(lua_istable(L, -1)) {
                    print_table(L);
                }
                lua_pop(L, 1);
            }
        }
    

    最佳答案

    f = {
        { name = "B", type = "U" },
        { name = "E", type = "F" },
    }
    

    等效于:
    f = {
        [1] = { name = "B", type = "U" },
        [2] = { name = "E", type = "F" },
    }
    

    当您在按键上调用lua_tostring时,Lua会将数字索引更改为字符串。
    const char *key = lua_tostring(L, -2);
    
    lua_tostring使用lua_tolstring并从manual中使用:



    最好使用lua_type来检查键是否确实是字符串,因为lua_isstring仅会告诉您是否可以将堆栈值转换为字符串。您还可以推送 key 的副本,然后在副本上调用lua_tostring

    关于c - 使用Lua C API遍历表格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29287988/

    10-09 22:55