MST

星途 面试题库

面试题:C语言与Lua脚本复杂数据交互

在C语言和Lua脚本交互场景下,假设Lua脚本中有一个函数 `process_table(tbl)`,该函数接收一个复杂的嵌套表(包含数字、字符串、子表等)作为参数,处理后返回一个新的表。请使用C语言代码实现构造合适的参数表传递给Lua函数,并正确接收和解析返回的表数据。
27.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

// 辅助函数:将C数组转换为Lua表
static void c_array_to_lua_table(lua_State *L, const int *arr, size_t len) {
    lua_newtable(L);
    for (size_t i = 0; i < len; ++i) {
        lua_pushinteger(L, i + 1);
        lua_pushinteger(L, arr[i]);
        lua_settable(L, -3);
    }
}

// 辅助函数:将C字符串数组转换为Lua表
static void c_str_array_to_lua_table(lua_State *L, const char **str_arr, size_t len) {
    lua_newtable(L);
    for (size_t i = 0; i < len; ++i) {
        lua_pushinteger(L, i + 1);
        lua_pushstring(L, str_arr[i]);
        lua_settable(L, -3);
    }
}

// 辅助函数:打印Lua表(假设表只有一级且键为数字)
static void print_lua_table(lua_State *L, int index) {
    lua_pushnil(L);  // 初始化迭代器
    while (lua_next(L, index) != 0) {
        // 此时栈顶为值,次栈顶为键
        if (lua_type(L, -2) == LUA_TNUMBER) {
            printf("key: %d, ", (int)lua_tonumber(L, -2));
        } else if (lua_type(L, -2) == LUA_TSTRING) {
            printf("key: %s, ", lua_tostring(L, -2));
        }
        if (lua_type(L, -1) == LUA_TNUMBER) {
            printf("value: %d\n", (int)lua_tonumber(L, -1));
        } else if (lua_type(L, -1) == LUA_TSTRING) {
            printf("value: %s\n", lua_tostring(L, -1));
        } else if (lua_type(L, -1) == LUA_TTABLE) {
            printf("value: table\n");
        }
        lua_pop(L, 1);  // 弹出值,保留键以便下一次迭代
    }
}

int main() {
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);

    // 加载Lua脚本
    if (luaL_dofile(L, "test.lua") != 0) {
        fprintf(stderr, "Error loading Lua script: %s\n", lua_tostring(L, -1));
        lua_close(L);
        return 1;
    }

    // 构造传递给Lua函数的参数表
    lua_getglobal(L, "process_table");

    // 假设构造一个简单的嵌套表作为参数
    int arr1[] = {1, 2, 3};
    const char *str_arr1[] = {"a", "b", "c"};

    lua_newtable(L);

    // 添加数字子表
    c_array_to_lua_table(L, arr1, sizeof(arr1) / sizeof(arr1[0]));
    lua_setfield(L, -2, "sub_table1");

    // 添加字符串子表
    c_str_array_to_lua_table(L, str_arr1, sizeof(str_arr1) / sizeof(str_arr1[0]));
    lua_setfield(L, -2, "sub_table2");

    // 调用Lua函数
    lua_call(L, 1, 1);

    // 解析返回的表数据
    if (lua_type(L, -1) == LUA_TTABLE) {
        printf("Returned table:\n");
        print_lua_table(L, -1);
    } else {
        printf("Unexpected return type\n");
    }

    lua_close(L);
    return 0;
}

在这个代码中:

  1. 首先使用luaL_newstateluaL_openlibs初始化Lua环境并打开标准库。
  2. 通过luaL_dofile加载Lua脚本,假设脚本名为test.lua,其中应包含process_table函数定义。
  3. 使用辅助函数c_array_to_lua_tablec_str_array_to_lua_table构造一个复杂的嵌套表作为参数传递给Lua函数。
  4. 调用process_table函数,并期望返回一个表。
  5. 最后使用print_lua_table辅助函数打印返回的表内容。

Lua脚本test.lua示例:

function process_table(tbl)
    local new_tbl = {}
    new_tbl.result1 = "processed " .. tbl.sub_table2[1]
    new_tbl.result2 = tbl.sub_table1[2] * 2
    return new_tbl
end

此Lua脚本接收传入的表,处理后返回一个新表。

请注意,实际应用中,你可能需要根据具体的嵌套表结构调整C语言中表构造和解析的代码。