您的位置:首页 > 其它

tcl/tk学习笔记:字符串

2011-11-01 14:58 1236 查看
教材:陈涛.Tcl 编程初步 tcl/tk入门经典(2)

1.几个有用的命令

append 将值追加到字符串尾

format 字符串格式

scan 字符串分解

binary 二进制字符串操作

string options 字符串操作和命令集

subst 字符替代(替代特殊字符)

regexp 正则表达式(用于字符串模式匹配)

regsub 用正则表达式进行字符串模式匹配和替换

2.append 变量1 $变量2 将变量2的值追加到变量1的未尾。

3.format

与C 语言中的 printf 和 sprintf 函数的格式功能类似。

format spec value1 value2 ...

spec为格式说明字符串,valuex不变元,每个变元最多有6个关键词:位置说明符、标志、字段宽度、精度、长度和转换符。

格式转换符与C类似,格式标志符:"-"表示左对齐,"+"右对齐,“space”在数字前没有前导符时,加一个空格,"0"用0补空白,前导o为八进制,x为十六进制。

位置说明符i$表示从第i个变元取数值,从1开始。

例:set res [format "%2\$s" 1 5 9] 取第二个变元的值5。

format "%o"20; 8进制输出20,结果为24

format "%x" 20; 16进制输出20,结果为14

format "%8x" 20; 16进制输出20,宽8位,右对齐,结果为——————14,“—”表示空格

format "%08x" 20; 16进制输出20,宽8位,右对齐,左补0,结果为00000014

format "%-8x" 20; 16进制输出20,宽8位,左对齐

format "%#x" 20; 16进制输出20,前缀为0x,结果是0x14

format "%#8x" 20;16进制输出20,前缀为0x,结果是0x00000014

format %c%e%c 40 30000 41;结果是(3.000000e+04),40和41的ASCII码为"("和")",%e是科学记数法

4.scan string format var? var? ....

与format相反,scan根据格式描述符来解析一个字符串并将对应值赋给后面的变量,返回成功转换的个数,如果没有指定输出变量则返回成功解析的结果。string是待解析的字符串,第二个是控制解析方式的格式字符串

后面的参数用来存储转换出的值。

例 scan "16 units,24.2% margin" "%d units,%f" a b; 结果是2 ;同时a = 16,b = 24.2

该操作同时扫描string和格式,除了被忽略的空格和制表符及% 字符,格式必须和字符串中的字符一一对应,上个例子中,16对应了%d,units,对应units,

24.2对应%f,格式不匹配的字符解析将失败。

有时候空格、制表符不能被忽略,如格式为%c时,%c是将string中的相应字符转换为整型。

例 scan "a%2" "%c%c%c" a b c;运行结果为3,表示成功转换了3个结果;a b c的值分别是97 37 51。

5.scan的几个常见用途

一是简单地解析字符串,上一小节中第一例这样的例子

二是将ASCII字符转换成对应的整型数字,上小节第二例如是

三是将可能是0开头的数字组成的字符串转换为整型数字

例 proc forceDecimal {x} {

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

if {$count != 1} {

error "not an interger"

}

return $n

}

set val 0987

expr { [forceDecimal $val + 1]}

运行结果是988,如果没有调用forceDecimal 函数,而是expr {$val + 1};则会报错。%lld支持无限精度,可存储任意大小的整数。

6.binary

对于数值来说,二进制(这里说的二进制是数据在机器中的存储方式,后面所说的八进制等只是表现形式)可能比ASCII码更省存储空间,tcl提供了数字的ASCII码和n进制码的转换:

binary format spec value1 ?value2 ...? 将数值类型转换为ASCII

binary scan string spec var1 ?var2 ...? 与上相反

spec 为格式描述字符串
例 set b [binary format "s" 25664] ; 将整型数25664(在内存中占4位)转换成字符串“25664”(在内中占5位),运行结果是"@d"。

25664的二进制表示是0110,0100,0100,0000,高8位是100,对应ASCII为"d",低8位是64,对应"@"

小写的s是从低位开始排列,所以结果是"@d"。

binary scan "@d" "s" var; 执行后puts $var的结果是25664

这里的格式字符前没有加"%",下面列出二进制转换的格式字符

类型 说明

a 包含 count 个字符的字符串。在 binary format 中以空字符作为补白

A 和 a 功能相同,只不过使用空格符而不是空字符作为补白。

b 长度为 count 的二进制字符串,以 0 和 1 组成,按照从低到高的 bit 位顺序排列

B 长度为 count 的二进制字符串,以 0 和 1 组成,按照从高到低的 bit 位顺序排列

h 长度为 count 的十六进制字符串,按照从低到高的字节顺序组成

H 长度为 count 的十六进制字符串,按照从高到低的字节顺序组成

c 一个 8 位字符编码。binary scan 中会从字符串中将字符转换为对应整数

s 字节顺序为 little-endian 的 16 位整数。count 用于指定重复特性

S 字节顺序为 big-endian 的 16 位整数。count 用于指定重复特性

i 字节顺序为 little-endian 的 32 位整数。count 用于指定重复特性

I 字节顺序为 big-endian 的 32 位整数。count 用于指定重复特性

f 本机格式的单精度浮点数。count 用于指定重复特性

d 本机格式的双精度浮点数。count 用于指定重复特性

x 使用 binary format 放置 count 个空字节。使用 binary scan 跳过 count 个字



X 回退 count 个字节

@ 跳到由 count 指定的绝对位置。如果 count 为*则跳到末尾

有些字符在终端居然显示不出来,比如224对应的ASCII字符,通常显示成个这"" !?

7.subst

{}中的$,\,[,]等符是不做替换的,但需要替换的时候也可以用subst实现

set a hello!

subst [{a = $a}] 运行结果是a = hello!

如果改成:subst {[puts {a = $a}]b = $a}; 结果就是a = $a b = hello!;理解是,解析器解析的时候,先将{a = $a}传递给了puts命令,puts命令执行完全后,再

将结果a = $a 和 后面的字符串b = $a 传递给subst,因为解析器不对结果进行第二次解析,所以a = $a这里不进行替换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: