首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Lua string.format %c对string.char

Lua string.format %c对string.char
EN

Stack Overflow用户
提问于 2013-05-15 14:35:50
回答 2查看 1.6K关注 0票数 3

Lua string.format( "%c", value )是否等同于string.char( value )

似乎不是当字符值为零时。

代码语言:javascript
代码运行次数:0
运行
复制
string.format( "%c", 0 ):len()

返回0

代码语言:javascript
代码运行次数:0
运行
复制
string.char( 0 ):len()

回报1

更奇怪的是

代码语言:javascript
代码运行次数:0
运行
复制
string.format( "%c%s", 0, "abc" ):len()

返回3;其中%c的任何其他非零模256值都返回4,因此string.format不会像C sprintf那样在空字节处截断整个字符串,而只是将%c字段折叠为空字符串而不是一个字节字符串。请注意,在本例中,C sprintf写入零字节,后面跟着abc字节。

我在Lua文档中找不到任何描述这种情况下预期行为的东西。Lua中的大多数其他字符串处理似乎将零字节视为有效的字符串字符。

这是在OpenWrt上的Lua5.1.4-8上。

怪癖还是虫子?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-15 15:17:02

我觉得这是个窃听器。

在Lua5.1和LuaJIT 2.0中,string.format一次格式化一个项(使用主机C运行时提供的sprintf )。然后调用strlen来更新输出字符串的长度。由于strlen在空字符处停止,此字符将被覆盖。

这是为%s记录的行为,但对于%c来说可能是无意的。

这一点在Lua 5.2中得到了修正。我不希望有更多的更新到5.1。

票数 6
EN

Stack Overflow用户

发布于 2013-05-16 05:54:04

在书“编程在lua”第二版。在2.4章中,有这样的上下文:“Lua中的strings具有通常的含义:一个字符序列。Lua是8位干净的,它的字符串可能包含任何数字代码,包括嵌入式零。这意味着您可以将任何二进制数据存储到一个字符串中。”

所以这不是一个错误

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16567979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档