3

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

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

string.format( "%c", 0 ):len()

返回 0

string.char( 0 ):len()

返回 1

再陌生,

string.format( "%c%s", 0, "abc" ):len()

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

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

这是 OpenWrt 上的 Lua 5.1.4-8。

异能还是错误?

4

2 回答 2

6

我认为这是一个错误。

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

这是记录在案的行为%s,但可能是无意的%c

这在 Lua 5.2 中已修复。我不希望对 5.1 有更多更新。

于 2013-05-15T15:17:02.307 回答
0

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

所以这不是一个错误

于 2013-05-16T05:54:04.543 回答