我有一個很大的字符串(一個base64編碼的圖像),它的長度爲1050個字符。我如何可以在C追加的小的形成了大串,這樣如何將一個大的lua字符串分解成小字符
function GetIcon()
return "Bigggg string 1"\
"continuation of string"\
"continuation of string"\
"End of string"
我有一個很大的字符串(一個base64編碼的圖像),它的長度爲1050個字符。我如何可以在C追加的小的形成了大串,這樣如何將一個大的lua字符串分解成小字符
function GetIcon()
return "Bigggg string 1"\
"continuation of string"\
"continuation of string"\
"End of string"
根據Programming in Lua 2.4 Strings:
我們還可以通過匹配分隔文字字符串雙方括號[...] ]。這個括號內的文字可以運行幾行,可以嵌套,並且不能解釋轉義序列。而且,當這個字符是換行符時,這個形式忽略了字符串的第一個字符。這種格式對編寫包含程序段的字符串特別方便;例如,
page = [[
<HTML>
<HEAD>
<TITLE>An HTML Page</TITLE>
</HEAD>
<BODY>
<A HREF="http://www.lua.org">Lua</A>
[[a text between double brackets]]
</BODY>
</HTML>
]]
這是最接近你要求什麼,但使用上述方法保持嵌入在字符串中的新行,所以這不會直接工作。
您也可以用字符串連接(使用..)做到這一點:
value = "long text that" ..
" I want to carry over" ..
"onto multiple lines"
您是否嘗試過 string.sub(S,I [,J])功能。 你可能想在這裏看看:
我想知道這是如何幫助的; OP的問題是從較小的字符串中構建一個長字符串,而不是其他方式,這就是答案 - 從較大的字符串'string.sub'中獲取較小的字符串。 – legends2k
此:
return "Bigggg string 1"\
"continuation of string"\
"continuation of string"\
"End of string"
C/C++的語法使編譯器看到這一切,作爲一個大的字符串。它通常用於可讀性。
的Lua的等效是:
return "Bigggg string 1" ..
"continuation of string" ..
"continuation of string" ..
"End of string"
請注意,C/C++語法編譯時間,而Lua的等效可能不會在運行時的連接(儘管編譯器理論上可以優化它)。這應該不是什麼大問題。
我會把所有的塊放在一張桌子上,並使用table.concat
就可以了。這避免了在每個級聯中創建新的字符串。例如(不包括Lua中字符串的開銷):
-- bytes used
foo="1234".. -- 4 = 4
"4567".. -- 4 + 4 + 8 = 16
"89ab" -- 16 + 4 + 12 = 32
-- | | | \_ grand total after concatenation on last line
-- | | \_ second operand of concatenation
-- | \_ first operand of concatenation
-- \_ total size used until last concatenation
正如您所看到的,這種爆炸非常迅速。最好是:
foo=table.concat{
"1234",
"4567",
"89ab"}
這將花費大約3 * 4 + 12 = 24個字節。
爲了節省內存,表連接可能很好,但比使用純串連接要慢大約4倍。 – devius
這裏的大多數答案在運行時解決了這個問題,而不是在編譯時。
Lua 5.2引入了轉義序列\z
來優雅地解決這個問題,而不會產生任何運行時開支。
> print "This is a long \z
>> string with \z
>> breaks in between, \z
>> and is spanning multiple lines \z
>> but still is a single string only!"
This is a long string with breaks in between, and is spanning multiple lines but still is a single string only!
\z
跳過串中的所有後續字符,直到所述第一非空格字符。這也適用於非多行文本文本。
> print "This is a simple \z string"
This is a simple string
轉義序列 '\ Z' 跳過的空白字符,包括換行以下跨度;將長文字字符串分割並縮進多行而不將新行和空格添加到字符串內容中特別有用。
謝謝,[[]]是我尋找的! – bratao
我會反對使用'..'太多評論:每一個連接產生一個新的字符串,這可能會嚴重損害性能。如果你想把很多小塊放在一起,把它們放在一個表中,並使用'table.concat'是一個更好的方法。 – jpjacobs
每一個新的連接生成一個新的字符串,但一個字符串中的多個連接一次完成==>查看上面的luac輸出;只有1個CONCAT操作碼。 – daurnimator