scan

ReferenceTOPKeywords

名前

scan - sscanf 式の変換指定子を使って文字列を解析します。

構文

scan string format ?varName varName ...?

概要

このコマンドはANSI C sscanf 関数と同じ方法で入力文字列のフィールドを解析し、変換の行われた回数を返します。 なんの変換も行われないうちに入力文字列が終端に達する場合は、-1を返します。 string は解析したい入力を与え、formatsscanfで%変換指定子を使って、どのようにそれを解析するかを示します。 各varName は変数の名前を示します。 string からフィールドがスキャンされたときに、結果が文字列に変換し戻されて対応する変数に割り当てられます。varName 変数が指定されないと、scanはインライン方法で機能します。それ以外の場合はリストとして変数に格納されるデータを返します。 インラインの場合において、全ての変換が行われる前に、入力文字列の終端に到達すると空文字列は返されます。

解説

scanstring format をともにスキャンしながら、操作を行います。 format の次の文字がブランクかタブなら、string 内の任意の数(0を含む)の空白文字にマッチします。そうでなければ、 なおそれが%文字でなければ、string の次の文字と一致しなければなりません。 format 内の%は変換指定子の始まりであることを示します。 変換指定子は%の後に最大4つのフィールドを持ちます。 *は、変換された値が変数に割り当てられる代わりに捨てられることを示します。 XPG3は、ポジション指定子です。次は、最大のフィールド幅を示す数字、及び変換文字です。変換文字を除いて、これらのフィールドは省略可能です。 存在するフィールドは上記で与えられた順番に現れなければなりません。

scanformat で変換指定子を見つけると、最初に(指定子が [ またcでない限り)string の空白文字をスキップします。それから次の入力文字列を変換指定子に従って変換し、scanへの次の引数で与えられる変数に保存します。

%2$d”のように、%の後が1つ10進数と$を付いている場合、使用する変数は後続する引数からは採りません。 代りに、それは数で示された位置にある引数からとります。ここで、1は最初のvarName と対応します。format に位取り指定子が存在すれば、 指定子の全ては位 取りでなければなりません。引数リスト上の各varName はちょうど1つずつの変換指定子と対応しなければなりません。 そうでないと、エラーが生成されます。インラインの場合は、 全ての位取りは1度だけ指定できます。空の位 取りは空文字列に書き込まれます。

次の変換文字がサポートされています。

d
o
x
u
i
c
s
e、f、またはg
[chars]
[^chars]
n
d
入力フィールドは10進数の整数でなければなりません。読み込まれ値は10進数文字列として変数に保存されます。
l または Lフィールドサイズ修飾子が与えられると、スキャンされた値はサイズで少なくとも64ビットである内部の表現を持っています。

o
入力フィールドは8進数の整数でなければなりません。 読み込まれ値は10進数文字列として変数に保存されます。l または Lフィールドサイズ修飾子が与えられると、スキャンされた値はサイズで少なくとも64ビットである内部の表現を持っています。 その値がMAX_INT l または Lフィールドサイズ修飾子が与えられないと 32 ビット整数を使うプラットホームで017777777777)を越えるならば、符号付き整数に切り捨てられます。従って、037777777777 は 32 ビットマシンにデフォルトで -1 として現れます。

x
入力フィールドは16進数の整数でなければなりません。読み込まれ値は10進数文字列として変数に保存されます。l または Lフィールドサイズ修飾子が与えられると、スキャンされた値はサイズで少なくとも64ビットである内部の表現を持っています。 その値がMAX_INT ( l または Lフィールドサイズ修飾子が与えられないと 32 ビット整数を使うプラットホームで0x7FFFFFFF)を越えるならば、符号付き整数に切り捨てられます。従って、0xFFFFFFFFは 32 ビットマシンに -1 として現れます。

u
入力フィールドは10進数の整数でなければなりません。その値は非符号化10進数文字列として変数に保存されます。l または Lフィールドサイズ修飾子が与えられると、スキャンされた値はサイズで少なくとも64ビットである内部の表現を持っています。

i
入力フィールドは整数でなければなりません。ベース (即ち、10進や8進や16進)は expr と同じ方法で決定されます。その値は10進数文字列として変数に保存されます。 l または Lフィールドサイズ修飾子が与えられると、スキャンされた値はサイズで少なくとも64ビットである内部の表現を持っています。

c
1つの文字が読み込まれそのバイナリ値が10進数文字列として変数に保存されます。この場合では先頭の空白はスキップされません。 したがって入力フィールドは空白文字でもかまいません。この変換のANSI 標準と異なる点は、入力フィールドが常に1つの文字であるということと、フィールド幅を指定できないことです。

s
入力フィールドは次の空白文字まで全部文字で構成されています。それらの文字は変数にコピーされます。

e  f   g
入力フィールドは浮動小数点数でなければなりません。 この浮動小数点数は省略可能な符号、小数点を含むかもしれない10 
進数文字列、そして省略可能な e あるいは E と続く省略可能な符号と10進数から構成されなければなりません。 読み込まれたものは、浮動小数点数の文字列として変数に保存されます。

[chars]
入力フィールドは chars 内のいくつかの文字で構成されます。 マッチした文字列は変数に保存されます。 大括弧の間の最初の文字が]であるとそれはセットの右大括弧としてではなく、chars の一部として扱われます。 chars がフォームマットa-b の列を含むと、(ab を含む)a の間のあらゆる文字はマッチします。大括弧 の間の最初と最後の文字が - であると、それは範囲を示すものではなくchars の一部分として扱われます。

[^chars]
入力フィールドはchars 内に含まれない、いくつかの文字で構成されます。 マッチした文字列は変数に保存されます。^の直後の文字が] であるとそれはセットの右大括弧 としてではなく、chars の一部として扱われます。 chars がフォームマットa-b の列を含むと、(ab を含む)a の間のあらゆる文字はセットから排除されます。 大括弧の間の最初と最後の文字が-であると、それは範囲を示すものではなく、chars の一部分として扱われます。

n
入力文字列から消費される入力はありません。 その代りに、そこまで入力文字列からスキャンされた文字の総数は変数に格納されます。

1つの変換に対して入力から読み込まれる文字の数は、その特定の変換において意味を成す最大の数です(例 %dとしてできる限り多くの10進数字、%oとしてできる限り多くの8進数字、以下同様)。与えられた変換の入力フィールドは空白文字に出会うか、 フィールドの最大幅に達するかのどちらが先に来ても終了します。変換指定子に*が現れると変数は割り当てられず、次のスキャン引数は消費されません。

ANSI SSCANFとの差異

scan コマンドの振る舞いはANSI C sscanf 関数の振る舞いと以下の違いを除いて同じです。

[1]
%p変換指定子は現在サポートされません。
[2]
%c変換で1つの文字値が10進数文字列に変換されて、相当するvarName に割り当てられます。 この変換ではフィールド幅を指定することが認められていません。
[3]
h修飾子は常に無視され、lL修飾子は実数の変換時無視されます(i.e. 内部の表現ではdouble型が使われます)。
 
[4]
あらゆる変換が行われる前に入力文字列の終端に到達するかつ変数が与えられないと、空文字列は返されます。

参照

format, sscanf

キーワード

conversion specifier, parse, scan


Copyright © 1993 The Regents of the University of California. Copyright © 1994-1996 Sun Microsystems, Inc. Copyright © 2000 Scriptics Corporation. Copyright © 1995-1997 Roger E. Critchlow Jr.