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 @   乐swap火  阅读(316)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示