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\n", 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("\n------ stack dump begin ------\n");
    for (int i = 1; i <= lua_gettop(L); ++i){
        int t = lua_type(L, i);
        switch (t){
        case LUA_TNONE:{
            printf("LUA_TNONE\n");
        }break;

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

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

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

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

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

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

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

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

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

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

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

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

 



 

 








posted @ 2021-03-17 20:28  乐swap火  阅读(295)  评论(0编辑  收藏  举报