zoukankan      html  css  js  c++  java
  • 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;
    }









    纯属记录程序人生,如有差错,欢迎指正,轻喷
  • 相关阅读:
    UOJ388 [UNR #3] 配对树
    洛谷P6151 [集训队作业2019] 青春猪头少年不会梦到兔女郎学姐
    CF908H New Year and Boolean Bridges
    CF704C Black Widow
    CF1338
    CF1361
    CF1110H Modest Substrings
    CF1322
    CF1182F Maximum Sine
    Elastic Stack(ELK)
  • 原文地址:https://www.cnblogs.com/Cxiangyang/p/14551735.html
Copyright © 2011-2022 走看看