scan(3tcl)

NAME
scan - 使用 sscanf 式样的转换指定符分析字符串

总览 SYNOPSIS
scan string format ?varName varName ...?

INTRODUCTION

这个命令用与 ANSI C sscanf 过程相同的方式从输入字符串中分析字段并返回完成的转换数目的总计，如果在任何转换被完成之前到达了输入字符串的结束则返回 -1。String 给出要被分析的输入而 format 指示如何分析它，使用与 sscanf 相同的 % 转换指定符。每个 varName 给出一个变量的名字；在从 string 中检索出一个字段的时候，结果被转换回一个字符串并赋值给相应的变量。 如果未指定 varName 变量，则 scan 在行内(inline)方式下工作，返回的数据将是一个列表而不存储在变量中。在行内方式下，如果在任何转换被完成之前到达了输入字符串的结束则返回，则返回一个空串。

检索细节 DETAILS ON SCANNING

Scan 操作一起检索 string 和 format。如果在 format 的下一个字符是一个空字符(blank)或跳格字符(tab)则它匹配在 string 中任何数目(包括零个)的白空格字符。 如果它不是一个 % 字符则它必须匹配 string 的下一个字符。当在 format 中遇到一个 % 的时候，它指示一个转换指定符的开始。 一个转换指定符包括 % 和后面的最多四个字段: 一个 *，它指示丢弃被转换出的值而不是赋值到变量中；一个 XPG3 位置指定符；一个数指示最大的字段宽度；和一个转换字符。除了转换字符之外所有这些字段都是可选的。存在的字段必须按照上面给出的次序出现。

当 scan 在 format 中发现一个转换指定符的时候，它首先跳过 string 中的所有白空格(除非指定符是 [ 或 c)。接着它依据转换指定符转换下一组输入字符，并把结果存储到用给 scan 的下一个参数给出的变量中。

如果 % 跟随着一个十进制数和一个 $，比如``%2$d''，则使用的变量不取自下一个顺序的参数。而是取自用这个数字指定的参数，这里 1 对应着第一个 varName。如果在 format 中有任何位置指定符则所有指定符都必须被指定位置。每个在参数列表上的 varName 必须准确的对应于一个转换指定符，否则生成一个错误。在行内方式下，任何位置指定符可以指定最多一次，并且用空串填充空位置指定符。

支持下列转换字符:

d   输入字段必须是一个十进制整数。它被读入并作为一个十进制字符串存储到变量中。

o   输入字段必须是一个八进制整数。它被读入并作为一个八进制字符串存储到变量中。 If the value exceeds MAX_INT (017777777777 on platforms using 32-bit integers), it will be truncated to a signed integer. Hence, 037777777777 will appear as -1 on a 32-bit machine.

x   输入字段必须是一个十六进制整数。它被读入并作为一个十六进制字符串存储到变量中。 If the value exceeds MAX_INT (0x7FFFFFFF on platforms using 32-bit integers), it will be truncated to a signed integer. Hence, 0xFFFFFFFF will appear as -1 on a 32-bit machine.

u   输入字段必须是一个十进制整数。它被读入并作为一个无符号十进制字符串存储到变量中。

i   输入字段必须是一个整数。使用与 expr 中描述的相同方式确定基数(base)(例如，十进制、八进制、或十六进制)。值被作为一个十进制字符串存储到变量中。

c   读入一个单一的字符并把它的二进制值作为一个十进制字符串存储到变量中。在这种情况下不跳过初始的白空格，这样输入字段可以是一个白空格字符。这个转换不同于 ANSI 标准的地方是输入字段总是由一个单一字段组成并且不可以指定字段宽度。

s   输入字段由到下一个白空格为止的所有字符组成；把这些字符复制到变量中。

e 或 f 或 g
    输入字段必须是一个浮点数，其组成是一个可选的正负号，一个可能有小数点的十进制数字的字符串，和一个可选的指数，它由一个 e 或 E 并跟随着一个可选的正负号和一个十进制数字的字符串组成。它被读入并作为一个浮点数存储到变量中。

[chars]
    输入字段由任何数目的在 chars 中的字符组成。把匹配的字符串存储到变量中。如果在方括号之间的第一个字符是] 则它被作为 chars 的一部分来对待而不是这个字符集合的闭合方括号。 如果 chars 包括一个 a-b 形式的序列，则匹配在 a 和 b 之间(包括二者)的任何字符。如果在方括号之间的第一个或最后一个字符是一个 -，则它被作为 chars 的一部分来对待而不是指示一个范围。

[^chars]
    输入字段由任何数目的不在 chars 中的字符组成。把匹配的字符串存储到变量中。如果紧随在 ^ 后面的字符是一个 ] 则它被作为 chars 的一部分来对待而不是这个字符集合的闭合方括号。 如果chars 包括一个 a-b 形式的序列，则从字符的集合中排除在 a 和 b 之间(包括二者)的任何字符。如果在方括号之间的第一个或最后一个字符是一个 -，则它被作为 chars 的一部分来对待而不是指示一个范围。

n   不从输入字符串中消耗输入。而是把到现在为止从输入字符串中检索到的字符总数存储到变量中。

对于一个转换从输入中读的字符数目应该是对特定转换最大的数目(例如，对 %d 是尽可能多的十进制数字，对于 %o 是尽可能多的八进制数字，以此类推)。给一个给定转换的输入要么终止于遇到一个白空格要么终止于达到了最大的字段宽度，只要其中一种情况满足就终止。如果在转换指定符中存在一个 * 则不赋值变量并且不消耗下一个检索参数。

与ANSI SSCANF 的区别 DIFFERENCES FROM ANSI SSCANF

除了下列区别之外 scan 命令的行为与 ANSI C sscanf 过程的行为相同:

[1] 当前不支持 %p 转换指定符。

[2] 对于 %c 转换，把一个单一字符转换成一个十进制字符串，接着把它赋值给相应的 varName；对于这个转换不能指定字段宽度。

[3] 忽略 l、h、和 L 修饰符；转换整数值总是如同不存在修饰符，而转换实数值总是如同存在 l 修饰符(就是说，对于内部表示使用类型 double)。

[4] 如果在任何转换被完成之前到达了输入字符串的结束并且未给出变量，则返回一个空串。

参见 SEE ALSO
format(n), sscanf(3)

关键字 KEYWORDS
conversion specifier, parse, scan

[中文版维护人]
寒蝉退士

[中文版最新更新]
2001/11/07

《中国 Linux 论坛 man 手册页翻译计划》:
http://cmpp.linuxforum.net