• CAPI c++ 遍历lua表


    1.一些用来遍历lua表的api简介

    以下是对下面几个函数的认识不对请批评指正:

    lua_istable:是否是一个表
    lua_gettable(L,int index) :把lua栈的索引为index表的lua栈的index+1所指的索引的值弹出。也就是弹出table[index+1];
    lua_next(L,index):先把 表(lua栈 index所指的表), 的当前索引弹出,再把table 当前索引的值弹出,也就是先弹出 table的索引,再弹出table索引的值

    2.代码示例

    // lua_table_extent.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "stdafx.h"
    #include "lua.hpp"
    #include "lauxlib.h"
    #include "lualib.h"
    #include <string.h>
    #include <windows.h>
    #include <iostream>
    using namespace std;
    #pragma comment(lib,"lua5.1.lib")
    #pragma comment(lib,"lua51.lib")
    
    
    /*
    luaJ_table.lua文件内容
    ----------------------------------------------
    NUMBER_TABLE =
    { 11,
    22,
    33,
    44,
    }
    
    NUMBER_TABLE_WITH_INDEX =
    {
    ["a"] = 1,
    ["b"] = 2,
    ["c"] = 3
    }
    
    
    STRING_TABLE_WITH_INDEX =
    {
    ["a"] = "this is a",
    ["b"] = "this is b",
    ["c"] = "this is c"
    }
    -----------------------------------------------
    */
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        lua_State *L = luaL_newstate();
        luaL_openlibs(L);
    
        if(0 != luaL_loadfile(L,"lua_table.lua"))
        {
            printf("loadbuff error :%s",lua_tostring(L,-1));
            lua_pop(L,1);
        }
    
        if(0 != lua_pcall(L,0,0,0))
        {
            printf("pcall error :%s",lua_tostring(L,-1));
            lua_pop(L,1);
        }
    
        lua_getglobal(L,"STRING_TABLE_WITH_INDEX");
        /*此时lua栈状态
        ----------------------------------
        |  -1 table NUMBER_TABLE
        ----------------------------------
        */
    
        if(!lua_istable(L,-1))
            cout<<"not a table"<<endl;
        /*此时lua栈状态
        ----------------------------------
        |  -1 table NUMBER_TABLE
        ----------------------------------
        */
    
        lua_pushnumber(L,1);
        /*此时lua栈状态
        ----------------------------------
        |  -1 1 key
        |  -2 table NUMBER_TABLE
        ----------------------------------
        */
        lua_gettable(L,-2);
        /*此时lua栈状态
        ----------------------------------
        |  -1 1 Value
        |  -2 table NUMBER_TABLE
        ----------------------------------
        */
        if(lua_isnumber(L,-1))
            cout<<lua_tonumber(L,-1)<<endl;
        else if(lua_isstring(L,-1))
            cout<<lua_tostring(L,-1)<<endl;
        /*此时lua栈状态
        ----------------------------------
        |  -1 1 Value
        |  -2 table NUMBER_TABLE
        ----------------------------------
        */
        lua_pop(L,1);
        /*此时lua栈状态
        ----------------------------------
        |  -1 table NUMBER_TABLE
        ----------------------------------
        */
    
    
        //循环遍历
        lua_pushnil(L);
        /*此时lua栈状态
        ----------------------------------
        |  -1 nil
        |  -2 table NUMBER_TABLE
        ----------------------------------
        */
        while(lua_next(L,-2))
        {
        /*此时lua栈状态
        ----------------------------------
        |  -1 value
        |  -2 key
        |  -3 table NUMBER_TABLE
        ----------------------------------
        */
            if(lua_isnumber(L,-2))
                cout<<"key:"<<lua_tonumber(L,-2)<<'\t';
            else if(lua_isstring(L,-2))
                cout<<"key:"<<lua_tostring(L,-2)<<'\t';
            if(lua_isnumber(L,-1))
                cout<<"value:"<<lua_tonumber(L,-1)<<endl;
            else if(lua_isstring(L,-1))
                cout<<"value:"<<lua_tostring(L,-1)<<endl;
    
        /*此时lua栈状态
        ----------------------------------
        |  -1 value
        |  -2 key
        |  -3 table NUMBER_TABLE
        ----------------------------------
        */
            lua_pop(L,1);
        /*此时lua栈状态
        ----------------------------------
        |  -1 key
        |  -2 table NUMBER_TABLE
        ----------------------------------
        */
        }
        lua_pop(L,1);
    
        /*此时lua栈状态
        ----------------------------------
        |  -1 table NUMBER_TABLE
        ----------------------------------
        */
        lua_close(L);
        system("pause");
        return 0;
    }

    以上代码的输出为

    key:a   value:this is a
    key:c   value:this is c
    key:b   value:this is b
    请按任意键继续. . .
    本人新博客网址为:http://www.hizds.com
    本博客注有“转”字样的为转载文章,其余为本人原创文章,转载请务必注明出处或保存此段。c++/lua/windows逆向交流群:69148232
  • 相关阅读:
    [置顶] Docker学习总结(3)——Docker实战之入门以及Dockerfile(三)
    [置顶] Docker学习总结(2)——Docker实战之入门以及Dockerfile(二)
    Vue-Router中History模式【华为云分享】
    Linux系统通过FTP进行文档基本操作【华为云分享】
    窥探日志的秘密【华为云分享】
    弹性负载均衡:负载无限,均衡有道【华为云分享】
    不给糖果就捣乱,用Python绘制有趣的万圣节南瓜怪【华为云分享】
    机器学习笔记(八)---- 神经网络【华为云分享】
    还在为运维烦恼?体验云上运维服务,提意见赢好礼!【华为云分享】
    Vue+ElementUI项目使用webpack输出MPA【华为云分享】
  • 原文地址:https://www.cnblogs.com/zhangdongsheng/p/3106992.html
Copyright © 2020-2023  润新知