A-A+

TCL中的字符串解析命令SCAN

2019年09月13日 14:22:44 腳本 暫無評論 閱讀 0 views 次

在TCL中scan命令提供的功能與ANSI C庫中的 sscanf函數幾乎完全一樣。它從一個有格式的字符串開始,在格式字符申控制下解析這個字符串,取得與格式字符串中%轉換符相對應的字段,把這些字段的值置于TCL變量中。例如,在執行下面這條命令以後,變量a的值為16,變量b的值為24.2。

scan "16 units, 24.2% margin”"% d units, %f" a b

→2

scan獲取的第一個參數是待解析的字符串,第二個參數是控制解析方式的格式字符串,其他的參數是用來存儲轉換出的值的變量。返回值2說明成功完成了兩次轉換。

scan操作同時掃描字符串和格式。除了被忽略的空格和制表符及%字符,格式必須與字符串中對應的字符匹配。除了少數幾種情況,如%c,字符串中的空白都會被忽略。

例1、字符串的格式轉換:将ASCII字符轉換為它們對應的整型值,即使用%c轉換符。

set char "x"

set value [scan $char %c]

→120

例2、數值類型轉換:把一個可能由0開頭的數字組成的字符串強制轉換為十進制整數。通常情況下開頭的0會讓TCL把該數字字符串解析為八進制的數值以供計算使用。下面這個過程強制将一個數字字符串解析為十進制數。

proc forceDecimal {x} {

set count [scan $x {%11d %c} n c]

if {$count !=1} {

    error "not an integer: \"$x\""

}

return $n

}

set val 0987

expr {$val+1}

→cant use invalid octal number as operand of "+"

expr { [forceDecimal $val] +1}

→988

forceDecimal xyz

→not an integer:"xyz"

在這個forceDecimal實現中,使用了scan命令處理參數格式,可以把跟在數字字符後面的非數字字符識别出來。如果隻是用%d作為格式參數,那麼scan命令會把字符串123xyz中的123識别出來。轉換符%11d中的11指定了用于存儲整型數的空間的大小,它支持無限精度。如果沒有這個11,轉換後的值的存儲空間會被限制為正在運行的系統中的機器字的大小。

本站微信公衆賬号,歡迎關注,如有問題可在下方留言也可在公衆賬号提問。

微信公衆賬号
标簽:

給我留言