
ASCII.png
前言#
從今天開(kāi)始我們要進(jìn)軍字符串操作的庫(kù)函數(shù)了,這些函數(shù)都放在全局表string中,說(shuō)起字符串操作熟悉c語(yǔ)言的程序猿都不會(huì)陌生,比如strcpy,strcmp,strlen等等,這些函數(shù)串處理的經(jīng)典函數(shù)。
lua中這個(gè)字符串處理庫(kù)也是提供對(duì)字符串處理的基本函數(shù),比如查找、提取子串、,模式匹配等等,在Lua中字符串的第一個(gè)字母索引為1,這一點(diǎn)不同于c語(yǔ)言中第一個(gè)字母索引為0的約定,并且在lua中引用字符串的索引可以為負(fù)數(shù),表示從字符串的末尾向前查找,比如字符串最后一個(gè)字母的索引可以表示為-1。
字符串處理庫(kù)的所有函數(shù)都被放置在表string中,并且還為操作的字符串設(shè)置了元表,使得這些字符串有了一個(gè)指向表string的__idnex字段,因此你可以用面向?qū)ο蟮姆绞絹?lái)調(diào)用這些函數(shù),比如函數(shù)string,.byte(s, i)可以寫成`s:byte(i)。
內(nèi)容#
string.byte()##
- 原型:string.byte (s [, i [, j] ])
- 解釋:函數(shù)返回字符
s[i], s[i+1], ···, s[j]的內(nèi)部數(shù)字編碼(ASCII碼),其中參數(shù)i的默認(rèn)值是1,而參數(shù)j的默認(rèn)值是i。需要注意的是該函數(shù)在返回的數(shù)字編碼在跨平臺(tái)方面不一定是可移植的。
Usage##
- 首先新建一個(gè)文件將文件命名為bytetest.lua然后編寫如下代碼:
-- 首先定義一個(gè)字符串
local str = "012abcd"
print("str = "..str)
-- 使用常規(guī)方式
print("\nafter string.byte(str,1,4)")
print(string.byte(str,1,4))
-- 使用另一種表現(xiàn)方式
print("\nafter str:byte(1,4)")
print(str:byte(1,4))
-- 使用負(fù)數(shù)索引
print("\nafter str:byte(-2,-1)")
print(str:byte(-2,-1))
-- 當(dāng)參數(shù)i大于j時(shí)
print("\nafter str:byte(2,1)")
print(str:byte(2, 1))
-- 當(dāng)索引無(wú)效時(shí)
print("\nafter str:byte(2000,1000000)")
print(str:byte(2000,1000000))
- 運(yùn)行結(jié)果

string_byte.png
總結(jié)#
- 首先需要注意的是這個(gè)字符串字處理庫(kù)假想字符串都是單字節(jié)編碼的。
- 在代碼的示例中我們測(cè)試了這個(gè)函數(shù)的兩種寫法結(jié)果都是一樣的。
- 通過(guò)結(jié)果可知使用負(fù)數(shù)來(lái)作為字符串中字符的索引也是沒(méi)有問(wèn)題的。
- 我們發(fā)現(xiàn)代碼
str:byte(2, 1)是沒(méi)有結(jié)果的,原因是這個(gè)函數(shù)不能從后往前依次顯示字符的ASCII碼,不管是證書索引還是負(fù)數(shù)索引,需要滿足參數(shù)i要小于等于參數(shù)j的值。 - 從最后一組測(cè)試可以看出當(dāng)引用的索引在原字符串中不存在時(shí),函數(shù)也是沒(méi)有返回結(jié)果的。