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