面试题答案
一键面试#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;
}
在这个代码中:
- 首先使用
luaL_newstate
和luaL_openlibs
初始化Lua环境并打开标准库。 - 通过
luaL_dofile
加载Lua脚本,假设脚本名为test.lua
,其中应包含process_table
函数定义。 - 使用辅助函数
c_array_to_lua_table
和c_str_array_to_lua_table
构造一个复杂的嵌套表作为参数传递给Lua函数。 - 调用
process_table
函数,并期望返回一个表。 - 最后使用
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语言中表构造和解析的代码。