lua调用C库之——字符串切割存到table中

Cocos2d-x Lua手游聊天系统:从TCP长连接到滚动列表的完整实现 在游戏开发中,网络通信是支撑实时交互的核心技术,其原理基于客户端与服务器之间建立稳定、高效的数据通道。TCP长连接作为一种可靠的传输协议,通过保持持续的连接状态,避免了HTTP短连接频繁建立与断开的开销,特别适合聊天、实时对战等高频率、低延迟的应用场景。其技术价值在于为游戏提供了稳定、有序的数据流,确保了消息的可靠送达,是构建实时社交功能的基础。在Cocos2d-x Lua这类轻量级跨平台引擎中,结合自定义的二进制数据包协议,开发者可以高效地处理网络层的粘包、拆包与心跳机制,从而构建出响应迅速的游戏内通信模 阅读详情

main.c

#include <stdio.h>
#include <string.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

static int l_split(lua_State* L)
{
	const char *s = luaL_checkstring(L, 1);
	const char *sep = luaL_checkstring(L, 2);
	const char *e;
	int i = 1;

	lua_newtable(L); //结果表
	//依次处理每个分割符

	while ((e = strchr(s, *sep)) != NULL)
	{
		lua_pushlstring(L, s, e - s); //压入子串
		lua_rawseti(L, -2, i++);	//向表中压入
		s = e + 1; //跳过分隔符
	}

	//插入最后一个子串
	lua_pushstring(L, s);
	lua_rawseti(L, -2, i);

	return 1; //将结果表返回
}

static luaL_Reg libs[] =
{
	{"split", l_split},
	{NULL, NULL}
};

__declspec(dllexport)//这个很重要,设置这个函数为外部链接 Linux不需要
int luaopen_mystring(lua_State* L) //函数名很重要这4个一定要这样,
{
	luaL_newlib(L, libs);
	return 1;
}

test_mystring.lua

local mystring = require("mystring")

local tb = mystring.split("http://www.runoob.com", ".") --执行后tb={"http://www", "runoob", "com"}

for i, v in ipairs(tb) do
    print(i, v)  --1是位置,v是值
end 

运行结果:

D:\lua_test>lua test_mystring.lua
1       http://www
2       runoob
3       com

相关函数用法介绍:

C 库函数 char *strchr(const char *str, int c) 在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
举例:

#include <stdio.h>
#include <string.h>

int main()
{
	const char str[] = "http://www.baidu.com";
	const char ch = '.';
	char *ret;
	ret = strchr(str, ch);
	printf("ret = %s\n", ret);

	char *ret2 = strchr(ret+1, ch);
	printf("ret2 = %s\n", ret2);

	getchar();
	return(0);
}

运行结果:

ret = .baidu.com
ret2 = .com

现在清楚这个函数的作用了。

lua_rawseti
原型: void lua_rawseti (lua_State *L, int index, int n);
描述: 为table中的key赋值. t[n] = v .其中t是index处的table , v为栈顶元素.
这个函数不会触发newindex元方法.
调用完成后弹出栈顶元素.

参考:
lua 和 C 语言进行交互 —— 如何传递table

C 库函数 - strchr()

Lua笔记-关于lua table的C API

SLua性能优化:解决Unity热更新中90%的GC分配问题 在Unity游戏开发中,GC(垃圾回收)是影响运行时性能的关键因素,尤其在移动平台,不当的内存分配会直接导致帧率波动和卡顿。其原理在于托管堆上频繁的对象创建会触发垃圾回收,中断主线程执行。对于采用Lua热更新的项目,C#与Lua虚拟机间的数据交互是GC分配的主要来源,优化此处的性能对提升游戏流畅度具有重要价值。SLua作为高效的Unity Lua绑定方案,通过其数据传递机制连接两个运行时环境,但开发者若不了解其底层机制,极易在函数参数传递、委托回调、字符串操作等高频场景中产生大量不必要的装箱和临时对象。本文 阅读详情

相关推荐

数据库之Redis运维手册(私人整理)

1、redis配置文件 #cat 8000.conf daemonize no #[yes/no]默认值no,该参数用于定制redis服务是否以守护模式运行。 pidfile /var/run/redis.pid #默认值/var/run/redis.pid,指定redis服务的进程号文件路径,以守护模式运行时需要配置本参数; port 8000 #默认值6379,指定redis服务...

企业实战系列集 ●●● https://ximenjianxue.blog.youkuaiyun.com 8636

lua源码剖析(一)

先来看lua中值的表示方式。 [code="java"]#define TValuefields Value value; int tt typedef struct lua_TValue { TValuefields; } TValue;[/code] 其中tt表示类型,value也就是lua中对象的表示。 [code="java"]typedef union { ...

但行好事 莫问前程 406

Nginx架构及配置详解

概述 Nginx采用C进行编写,是俄罗斯程序员开发的一款轻量级的可构建Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器的软件, Nginx服务器是一个高性能的HTTP和反向代理web服务器,同时也可提供了IMAP/POP3/SMTP服务。nginx常用作跑静态和做负载反向代理,动态php交给apache处理,因后者比较稳定,jsp交给tomcat、resin或jboss。n......

企业实战系列集 ●●● https://ximenjianxue.blog.youkuaiyun.com 7070

lua分割字符串

function FGUtilStringSplit(str,split_char) ------------------------------------------------------- -- 参数:待分割的字符串,分割字符 -- 返回:子串表.(含有空串) local sub_str_tab = {}; while (true) do local p...

aobu0171的博客 212

lua切割字符串为数组(split)

lua字符串转数组,类似js里的split()和php里的explode()

网络安全隔离技术解析:单向网闸与双向网闸的核心差异与应用场景

本文深入解析网络安全隔离技术中的单向网闸与双向网闸,详细比较两者的核心差异与应用场景。单向网闸通过物理隔离确保数据单向流动,适用于金融交易等高风险场景;双向网闸则支持严格安检的双向数据交互,常见于医疗、政务等领域。文章还提供了选型建议和技术发展趋势,帮助读者根据安全需求和业务场景选择最适合的网闸解决方案。

weixin_29323365的博客 527

未完成

static int str_len (lua_State *L) {   size_t l;   luaL_checklstring(L, 1, &amp;l);   lua_pushinteger(L, l);   return 1; } 获取字符串长度, luaL_checklstring与之前的luaL_checknumber有像,luaL_checknumber的作用是检出一个数字 lu...

weixin_38825407的博客 352

英飞凌TC3xx的GTM模块到底有多强?从PWM生成到电机驱动,一篇讲透车载定时器核心

本文深入解析英飞凌TC3xx系列中的GTM模块在汽车电子领域的强大功能,从PWM生成到电机驱动的全链路设计。通过模块化架构和硬件级解决方案,GTM显著提升系统精度和响应速度,适用于电机控制、电源管理等复杂场景。文章结合实战经验,详细拆解GTM的技术实现和性能优势。

weixin_27741699的博客 204

快速掌握Lua 5.3 —— 编写提供给Lua使用的C库函数的技巧 (1)

Q:如何在C库函数中灵活的操作Lua的”table”?A:--[[ void lua_settable(lua_State *L, int index); 从虚拟栈中"index"处获得"table",栈顶获得"value", 栈顶下面一个元素获得"key"。相当于在Lua环境中执行"table[key] = value"命令, 设置"table[key]"的过程有可能

VermillionTear的专栏 5278

在微信小程序中如何引入iconfont

略

sayyy的专栏 4325

Cloudflare 5秒盾破解实战:Python补环境框架下的13次请求全解析

本文深入解析Cloudflare 5秒盾(5-second challenge)的工作原理,并提供基于Python环境的自动化应对策略。通过13次请求流程分解、动态脚本处理技术和环境指纹模拟,帮助开发者有效绕过这一复杂的人机验证机制,提升自动化工作效率。

weixin_30772105的博客 177

Lua字符串模式和捕获

已经拿Lua用了快两年的时间了,但是每次用到字符串的模式匹配的时候就总要去翻看Lua官网的说明,网上也没有一个比较详细的说明,也有好多朋友都向我询问这块的内容,其实这块的难点有三:一个是对Lua的正则表达式不熟悉;另一个是对Lua中string库提供的几个函数的用法不熟悉;还有一点是Lua的string库提出了一个新的概念,叫做捕获,其实也不算什么新概念,只是和函数调用杂糅在...

weixin_34067049的博客 1620

向量乘法器设计

同样基于Wallace树乘法器,我们来构造向量乘法器。 在一些矩阵运算中经常用到向量的相乘运算,本例以4维向量为例子介绍向量乘法器的verilog HDL设计。 设向量a = (a1, a2, a3, a4), b = (b1, b2, b3, b4)。 则a 与 b的点乘为:a * b = a1 b1 + a2 b2 + a3 b3 + a4 b4, 即向量对应位置的值相乘,再相加...

Reborn Lee 2969

C开发lua模块(二) --- 操作table和调用lua函数

此篇是上篇入门篇的后续文章,上篇地址:http://blog.youkuaiyun.com/zhang197093/article/details/76400871 C语言没有类似 lua_pushtable 和 lua_totable 的方法,这也很容易理解,因为C语言中没有一种数据类型可以和lua中的table相对应的,那C函数怎么操作table类型的参数或者返回table类型的结果呢,lua API中

zhang197093的博客 1万+

精度与速度双突破:YOLOv8-Pose 在 RK3588 上实现高性能人体姿态分析部署

本教程从YOLOv8-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

know_F0727的博客 434

手把手教你学pcie--用Verilog搭建PCIe控制器核心模块

PCIe控制器是硬件设计的核心模块,负责实现设备与主机之间的高速通信。本文将以Verilog语言为例,分步骤讲解如何从零构建一个简化的PCIe控制器核心模块,涵盖事务层(TLP)生成、数据链路层(DLLP)处理和物理层(PHY)接口适配。目标是为嵌入式开发者、FPGA工程师提供一个可扩展的硬件设计框架。​。

MHD0815的博客 339

Lua C 字符串和数组操作

数组操作在Lua中,“数组”只是table的一个别名,像lua_settable和lua_gettable这种操作table的函数,也可以用于操作数组。 然而API为为数组操作提供了专门的函数。 * 出于性能考虑,通常会在算法中用循环来访问数组 * 为了方便,像字符串key,整数key是很常用的//index表示在栈中的位置,key表示元素在 table中的位置 void lua_rawge

kavenGw的专栏 2298

从0到1带大家搭建spring cloud alibaba 微服务大型应用框架(十一)spring-boot-admin 监控篇(2)springcloud 集成spring boot admin

从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十一)spring-boot-admin 监控篇(2)springcloud 集成spring boot admin spring-boot-admin 服务端创建与集成入nacos spring-boot-admin 查看日志

峡谷电光马仔的博客 1378

Lua 字符串库函数总结

字符串库 注:字符串在Lua中是不可变的。不论什么的string操作都不会去改变原有的字符串。都是返回新的字符串 一、一般函数 1. 求长度 s = "Hello LUA "; print(string.len(s)); print(#s); 2. 反复 print(string.rep(s,3)); -- s 反复了3次 3. 大写和小写转...

diandingyin9417的博客 321

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

lua基础【三】唯一数据结构table表

--[[ 数据结构table对象(一种动态分配的对象) lua中的表操作。table类型实现了“关联数组的”。“关联数组是一种具有特殊索引方式的数组” 能够通过下标或者字符串来索引它,table没有固定的大小,table是Lua仅有的数据结构, 既然这么说,就表明table的意义非常重大,也极为重要 我们能够用table表示普通数组,字符表,集合记录,队列。...

weixin_33875564的博客 171

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

游戏引擎中集成Lua-protobuf:实现高效数据序列化的完整指南

数据序列化是游戏开发中的基础技术,它负责将复杂的数据结构转换为可传输或存储的二进制格式。Protocol Buffers作为一种高效的二进制序列化协议,通过强类型Schema定义和紧凑的编码格式,在性能与数据一致性方面具有显著优势。其核心价值在于减少网络传输开销、提升解析速度,并确保前后端数据结构的严格匹配,广泛应用于网络游戏通信、配置表加载等场景。在游戏开发中,Lua因其热更新特性常被用于逻辑层,而Lua-protobuf库则充当了连接Protobuf协议与Lua环境的桥梁,支持运行时动态加载.pb描述文

weixin_33913332的博客 404

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Wisp:用Lua脚本和结构化管道革新Linux Shell工作流

在Linux系统管理和自动化领域,Shell脚本是连接系统命令与复杂逻辑的核心工具。传统Shell(如Bash)基于文本流和管道进行进程间通信,其原理简单直接,但处理结构化数据时面临解析脆弱、错误处理困难等挑战。这催生了将现代脚本语言与Shell流式处理相结合的技术需求,其价值在于提升复杂任务的可维护性和开发效率。应用场景广泛,包括日志分析、系统监控、数据提取与报告生成等。本文聚焦的Wisp Shell,正是通过引入Lua脚本引擎和结构化管道来解决这些痛点,它允许数据以表格(Table)形式在命令间传递,从

weixin_30336061的博客 352

Wisp:用Lua和结构化管道革新Linux命令行数据处理

在Linux系统管理和自动化运维中,命令行数据处理是核心技能。传统Shell依赖文本流管道和awk、sed等工具处理数据,虽然灵活但面对复杂结构化数据时,代码往往变得繁琐且脆弱。其原理是通过文本切割和正则表达式进行模式匹配,这在处理JSON、日志分析等场景下效率较低。Wisp引入了一种创新方案:将Lua脚本引擎嵌入Shell环境,并实现结构化数据管道。这种技术价值在于让数据以表、数组等原生结构在命令间流动,开发者可以直接使用编程语言的数据操作方式,无需依赖文本解析。这显著提升了数据清洗、系统监控和自动化脚本

weixin_34221112的博客 407

Wisp:用Lua脚本和结构化管道革新Shell数据处理

在系统管理和自动化运维中,数据处理是核心需求。传统Shell环境依赖文本流传递数据,通过grep、awk、sed等工具进行解析,这种方式在处理JSON、CSV等结构化数据时效率低下且容易出错。结构化管道技术应运而生,它允许数据在命令间以带类型和结构(如表、数组)的形式传递,而非纯文本流。这一原理极大地提升了数据操作的直观性和代码可读性,其技术价值在于弥合了系统管理脚本与现代编程语言数据抽象之间的鸿沟。在应用场景上,它特别适合处理需要复杂条件判断、数据转换和嵌套信息提取的自动化任务,例如日志分析、配置管理以及

weixin_34413103的博客 426

Nosql之Redis详解

概述 定义:Redis是一个开源的,使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 redis是一个key-value存储系统。和Memcached类似,只是它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash......

企业实战系列集 ●●● https://ximenjianxue.blog.youkuaiyun.com 1605
上一篇: lua与C交互之——对lua数组的每个元素调用同一个函数
下一篇: 图解lua和C——table传递参数过程
hp_cpp
博客等级 码龄11年 310粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值