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;
    }









    纯属记录程序人生,如有差错,欢迎指正,轻喷
  • 相关阅读:
    CentOS+Phpstudy安装Sqli-Labs
    机器学习中的偏差与方差
    DVWA学习之SQL注入
    【转】EDNS
    【转】个人总结-网络安全学习和CTF必不可少的一些网站
    信息安全书单
    全球信息安全会议 Top 50
    【转】Linux编程之UDP SOCKET全攻略
    网络协议栈学习之重要的数据结构
    网络协议栈学习(二)创建 socket
  • 原文地址:https://www.cnblogs.com/Cxiangyang/p/14551735.html
Copyright © 2011-2022 走看看