Chinaunix首页 | 论坛 | 博客
  • 博客访问: 182569
  • 博文数量: 42
  • 博客积分: 2235
  • 博客等级: 大尉
  • 技术积分: 460
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-15 20:17
文章分类

全部博文(42)

文章存档

2012年(1)

2011年(7)

2010年(33)

2009年(1)

我的朋友

分类:

2010-02-02 21:58:28

scan - 以sscanf的形式使用转换符解析字符串

语法:
scan string format ?varName varName ...?

介绍:
scan命令根据format的格式解析string并给varName赋值,返回成功转换的次数。如果没有提供varName,将以列表形式返回scan匹配值
scan命令和format命令类似.支持的转换字符如下:

d
   输入必须为一个十进制整数。其被读入并以十进制字符串方式存入变量。如果提供l或者L此类修改器字符,则扫描的值将以64-bit形式表示
o
   输入必须为一个八进制整数。其被读入并以十进制字符串方式存入变量。如果提供l或者L此类修改器字符,则扫描的值将以64-bit形式表示。如果其值超过MAX_INT(当没有l或者L时,32-bit平台为017777777777),将被截断成一个有符号整形数。因此,037777777777 在32-bit机器上默认将被表示为-1
x
   输入必须为一个十六进制整形数。其被读入并以十进制字符串方式存入变量。如果提供l或者L此类修改器字符,则扫描的值将以64-bit形式表示。如果其值超过MAX_INT(当没有l或者L时,32-bit平台为017777777777),将被截断成一个有符号整形数。因此,037777777777 在32-bit机器上默认将被表示为-1
u
   输入必须为一个十进制整形数。其被读入并以无符号十进制字符串方式存入变量。如果提供l或者L此类修改器字符,则扫描的值将以64-bit形式表示。
i
   输入必须为一个整形数。进制取决于如expr描述的方式。其被读入并以无符号十进制字符串方式存入变量。如果提供l或者L此类修改器字符,则扫描的值将以64-bit形式表示。
c
   输入为单字符其二进制值以十进制字符串形式保存在变量中。初始的空格在这种情况下不会被跳过,所以输入可以使空格。这个转换不同于ANSI标准(输入永远由单字符组成并且没有指定域宽度)
s
   输入由直到下一个空白符的所有字符组成;字符会复制给变量
e f g
   输入必须为由可选的符号,十进制字符串以及小数点组成的浮点数,可选的指数由e或者E后跟可选符号以及十进制字符串。其被读入并以浮点型字符串方式存入变量。
   
[chars]
   输入由任意数目的字符组成。匹配的字符串存在变量中。用于匹配一组某一范围的字符,用-表示范围,如果-出现在最先或者最后被当做一个字符

[^chars]
   输入由任意数目的字符组成。匹配的字符串存在变量中。用于匹配一组某一范围的字符以外的部分,用-表示范围,如果-出现在最先或者最后被当做一个字符
n
   不输入任何字符。扫描字符的总数取自最近扫描后所存储的变量

举例:
将一个简单的颜色代码(#RRGGBB方式)解析为不同域的值
set string "#08D03F"
scan $string "#%2x%2x%2x" r g b

解析HH:MM时间字符串,注意避免通过强制转换十进制而带来的八进制数问题
set string "08:08"   ;# *Not* octal!
if {[scan $string "%d:%d" hours minutes] != 2} {
   error "not a valid time string"
}
# We have to understand numeric ranges ourselves...
if {$minutes < 0 || $minutes > 59} {
   error "invalid number of minutes"
}

将一个字符串分解成非空格字符的一系列集合(注意使用%n转换使得能够跳过第一个空格的字符)
set string " a string {with braced words} + leading space "
set words {}
while {[scan $string %s%n word length] == 2} {
   lappend words $word
   set string [string range $string $length end]
}

解析一个简单的坐标字符串,通过查找显式终止字符检查是否完成
set string "(5.2,-4e-2)"
# Note that the spaces before the literal parts of
# the scan pattern are significant, and that ")" is
# the Unicode character \u0029
if {
   [scan $string "(%f,%s %c" x y last] != 3
   || $last != 0x0029
} then {
   error "invalid coordinate string"
}
puts "X=$x, Y=$y"
阅读(2100) | 评论(0) | 转发(0) |
0

上一篇:format命令

下一篇:clock命令

给主人留下些什么吧!~~