c中遍历lua的表

//遍历lua表,index为表在栈中的位置
void traverse_table(lua_State* L, int index)
{
    lua_pushnil(L);
    stack_dump(L);
    while (lua_next(L, index))
    {
        //拷贝一个临时key到栈顶
        lua_pushvalue(L, -2);
        const char* key = lua_tostring(L, -1);
        const char* value = lua_tostring(L, -2);
        //std::cout << "key is:" << key << " value is:" << value << std::endl;
        printf("key is:%s,value is:%s
", key, value);
        //删除临时key和value
        lua_pop(L, 2);
    }
    stack_dump(L);
}

其中lua_next会把表中的每一个键值对压入到栈上,

用 lua_pushvalue(L, -2);的目的是为了搞一个临时key,不对key直接进行tostring,原因不太了解,参考手册中描述如下:
打印栈中元素(从栈底开始)
void stack_dump(lua_State* L){
    printf("
------ stack dump begin ------
");
    for (int i = 1; i <= lua_gettop(L); ++i){
        int t = lua_type(L, i);
        switch (t){
        case LUA_TNONE:{
            printf("LUA_TNONE
");
        }break;

        case LUA_TNIL:{
            printf("LUA_TNIL
");
        }break;

        case LUA_TBOOLEAN:{
            printf("LUA_TBOOLEAN : %s
", lua_toboolean(L, i) ? "true" : "false");
        }break;

        case LUA_TLIGHTUSERDATA:{
            printf("LUA_TLIGHTUSERDATA
");
        }break;

        case LUA_TNUMBER:{
            //整形
            if (lua_isinteger(L, i)){
                printf("LUA_TNUMBER integer : %lld 
", lua_tointeger(L, i));
            }
            else if (lua_isnumber(L, i)){
                printf("LUA_TNUMBER number: %g
", lua_tonumber(L, i));
            }
        }break;

        case LUA_TSTRING:{
            printf("LUA_TSTRING : %s
", lua_tostring(L, i));
        }break;

        case LUA_TTABLE:{
            printf("LUA_TTABLE
");
        }break;

        case LUA_TFUNCTION:{
            printf("LUA_TFUNCTION
");
        }break;

        case LUA_TUSERDATA:{
            printf("LUA_TUSERDATA
");
        }break;

        case LUA_TTHREAD:{
            printf("LUA_TTHREAD
");
        }break;

        case LUA_NUMTAGS:{
            printf("LUA_NUMTAGS
");
        }break;

        default:{
            printf("%s
", lua_typename(L, t));
        }break;
        }
    }

    std::cout << "------ stack dump end ------" << std::endl;
}









纯属记录程序人生,如有差错,欢迎指正,轻喷
原文地址:https://www.cnblogs.com/Cxiangyang/p/14551735.html