本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 3 : ライブラリ (N~Z) > s

scanf(3S)

HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

scanf, fscanf, sscanf ― ストリームファイルからの読み取りでの書式付き入力変換

構文

#include <stdio.h>

int scanf(const char *format, /* [pointer,] */ ...);

int fscanf(FILE *stream, const char *format, /* [pointer,] */ ...);

int sscanf(const char *s, const char *format, /* [pointer,] */ ...);

説明

scanf() は、標準入力ストリーム stdin から読み取ります。

fscanf() は、指定された入力 stream から読み取ります。

sscanf() は、文字列 s から読み取ります。

それぞれの関数は、文字を読み取り、制御文字列 format 引き数 に従って、文字列を解釈し、結果を pointer 引き数に格納します。 書式に対して引き数が不足している場合には、動作は不定となります。 引き数が余っている状態で書式が尽きた場合には、余分な引き数は無視されます。 制御文字列は、変換指定文字および入力文字列の解釈の指示をする他の文字を内容とします。 制御文字列は、以下のものを含みます。

  • 空白文字 (空白、タブ、改行、用紙送り)。次の非空白文字まで入力は読み飛ばされます (下記の 2 つのケースを除きます)。

  • 通常の文字 (% を除く)。 入力ストリームの次の文字に一致しなければなりません。

  • 文字 % からなる変換指定、オプションの代入抑制文字 *、 オプションの最大フィールド幅値、受け取り変数のサイズを示すオプションの l (エル), ll, (エルエル), h または L , 変換コード

  • 文字 % の代わりに 文字列 %n$ を変換仕様の前に置くことができます。 このとき、 n は 10 進数の整数で、 (1-{NL_ARGMAX}) の範囲内です (NL_ARGMAX<limits.h> 中で定義されています)。 %n$ 構造は、次の入力フィールドの値が n 番目の引き数に代入され、次の引き数には用いられないことを示します。 変換仕様の 2 つの導入形式、 %%n$ が、1 つの format 文字列中に混在することは、以下の例外を除いては許されません。 すなわち、スキップフィールド (以下を参照) が、 %* または %n$* として明示できる場合です。 後者の場合、 n は無視されます。

仕様が変換文字 n (以下で説明) を含んでいない場合には、変換仕様は次の入力フィールドの変換を指示します。 変換仕様の結果は、 * によって代入抑制が指示されていない限り、対応する引き数の示す変数に代入されます。 代入抑制は、スキップされる入力フィールドを記述する方法を提供します。 入力フィールドは、非スペースの文字の文字列によって定義されます。 すなわち、次の不適切な文字、またはフィールド幅が指定されているならばそこまでが、入力フィールドとなります。 [c 以外のすべての記述子に対して、先頭の空白である入力フィールドは無視されます。

変換コードは、入力フィールドの解釈を示します。対応するポインター引き数は、限定された型でなくてはなりません。 抑制フィールドには、ポインター引き数は与えられません。 以下に、有効な変換コードを示します。

%  

単独の % は、この場所での入力を求め、代入は行いません。

d  

10 進数整数として解釈します。対応する引き数は、整数型へのポインターでなければなりません。

u  

符号なしの 10 進数整数として解釈します。対応する引き数は、符号なしの整数型へのポインターでなければなりません。

o  

8 進数整数として解釈します。対応する引き数は、符号なしの整数型へのポインターでなければなりません。

xX 

16 進数整数として解釈します。対応する引き数は、符号なしの整数型へのポインターでなければなりません。 x および X の変換文字は、同じものです。

i  

整数として解釈します。対応する引き数は、整数型へのポインターでなければなりません。 C 規約によって解釈された入力項目の次の値が代入されます。すなわち、先行する 0 は、8 進数を示し、先行する 0x は、16 進数を示します。その他の場合は、10 進数が仮定されます。

hL  

extended 型として解釈します。 対応する引き数は、 extended 型のポインター (Itanium アーキテクチャでの 80 ビットの IEEE-754 double-extended 型) であり、浮動小数点指定子 a, A, e, E, f, g, G と一緒に使う必要があります。

n  

関数が呼び出されてから今まで走査されたバイト総数 (空白を含む) を格納します。対応する引き数は、整数型へのポインターでなければなりません。 入力は使用しません。 関数の戻り値には、%n による一致および代入が成功した回数を含みません。

a,A,e,E,f,g,G 

浮動小数点数として解釈します。次のフィールドは適切に変換され、対応する引き数 float へのポインター) に従って格納されます。 この変換コードで受け付けることのできる浮動小数点数の形式は次のとおりです。 つまり、数字列を基本とし、この数字列にオプションとして、符号、小数点キャラクタ、および指数フィールドが付いた形式です。 指数フィールドがある場合は、数字列の後ろに付きます。 指数自体は、 E または e を先頭に置いて、その後ろに +, -, またはスペースを置き、さらにその後ろに整数を置く、という形式を取ります。 ただし、 +, -, またはスペースは省略可能です。 Itanium(R) ベース システムの場合は、入力として 16 進浮動小数点数も受け付けます。 この場合の浮動小数点数の基本形式は次のとおりです。 つまり、16 進文字列を基本とし、この 16 進文字列に符号、小数点キャラクタ、および 2 進指数フィールドが付いた形式です。 2 進指数フィールドがある場合は、16 進文字列の後ろに付きます。 2 進指数自体は、数の有効部分 (小数部) を実際の位にするためのスケーリングファクターを、2 を基数としたべき指数で表したものであり、 P または p を先頭に置いて、その後ろに +, -, またはスペース文字を置き、さらにその後ろに 10 進整数を置くという形式を取ります。 ただし、 +, -, またはスペースは省略可能です。 変換文字 A, E および G は、 a, e および g と、それぞれ同様の働きをします。 変換文字の a, A, e, E, f, g, および G は、文字列 inf (大文字と小文字の区別なし) または文字列 infinity (大文字と小文字の区別なし) を、 適切な浮動小数点の無限大値 (変換精度を示す識別子によって、単精度、倍精度、4 倍精度といった精度が指定可能) に変換します。 変換文字の a, A, e, E, f, g, および G は、 文字列 nan (大文字と小文字の区別なし) を、 適切な浮動小数点の NaN 値 (変換精度を示す識別子によって、単精度、倍精度、4 倍精度といった精度が指定可能) に変換します。

c  

文字として解釈します。対応する引き数は文字型へのポインターでなければなりません。通常行われる空白のスキップは抑制されます。次の非スペース文字を読むには %1s を使います。フィールドの幅が与えられている場合には、対応する引き数は文字配列を参照します。すなわち、指定された個数の文字を読み取ります。

l (エル) 修飾子が存在する場合は、初期シフト状態で始まる文字シーケンスが入力されます。シーケンス内の各文字は、 mbrtowc() 関数を呼び出したかのようにワイドキャラクタに変換され、変換状態は、最初の文字が変換される前にゼロに初期化される mbstate_t オブジェクトによって記述されます。対応する引き数は、結果として生成されるワイドキャラクタのシーケンスを受け入れられる大きさの wchar_t の配列へのポインターでなければなりません。null ワイドキャラクタは付加されません。 通常行われる空白のスキップは抑制されます。次の非スペース文字を読むには、 %1S を使います。 フィールドの幅が与えられている場合には、対応する引き数はワイドキャラクタ配列を参照します。すなわち、指定された個数の文字を読み取り、変換します。

C  

lc と同じです。

s  

文字列として解釈します。対応する引き数は、文字列および自動的に付加される、終端の \0 を格納するのに充分な大きさを持った、文字の配列を指す文字型へのポインターでなければなりません。入力フィールドは、空白文字によって終了します。 scanf() は、null 文字列を読み取れません。

l (エル) 修飾子が存在する場合は、初期シフト状態で始まる文字シーケンスが入力されます。各文字は、 mbrtowc() 関数を呼び出したかのようにワイドキャラクタに変換され、変換状態は、最初の文字が変換される前にゼロに初期化される mbstate_t オブジェクトによって記述されます。対応する引き数は、このシーケンスと、自動的に付加される終端の null ワイドキャラクタを受け入れるのに充分な大きさを持った wchar_t の配列へのポインターでなければなりません。 入力フィールドは、空白文字によって終了します。 scanf() は、null 文字列を読み取れません。

S  

ls と同じです。

[  

文字列データを示し、通常行われる空白のスキップは抑制されます。左の角括弧の後に scanset と呼ばれる文字のセットを続け、右の角括弧で閉じます。入力フィールドは、scanset 中の文字で完全に構成される入力文字の最大限の連続です。アクセント記号 (^) が scanset の文字の最初にある場合には、相補的なオペレータとして作用して、scanset 文字列に含まれない残りの文字すべてを新たな scanset として再定義します。 scanset の作成は、ある規約に従って行われます。文字の範囲は first-last 形式で表され、[0123456789] は、[0-9] と書き表すことができます。 この規約を用いる際には、 firstlast と辞書式の順番で等しいかまたは小さくなければなりません。そうでない場合には、ダッシュ自身を表すことになります。ダッシュは scanset 中の文字の最初あるいは最後にある場合にも、ダッシュ自身を表します。scanset の要素の中に右の角括弧を入れるには、scanset の最初の文字として現れる必要があり (できるならばアクセント記号を頭につけて)、そのような場合には、文法的に、閉じ括弧とは解釈されません。対応する引き数は、データフィールドおよび自動的に付加される終端の \0 を格納するのに充分な大きさを持った文字の配列を指す、文字型へのポインターでなければなりません。正常終了のためには、少なくとも 1 文字は一致する必要があります。

l (エル) 修飾子が存在する場合は、初期シフト状態で始まる文字シーケンスが入力されます。シーケンス内のそれぞれの文字は、 mbrtowc() 関数を呼び出したかのようにワイドキャラクタに変換され、変換状態は、最初の文字が変換される前にゼロに初期化される mbstate_t オブジェクトにより記述されます。対応する引き数は、このシーケンスと、自動的に付加される終端の null ワイドキャラクタを受け入れるのに充分な大きさの wchar_t の配列へのポインターでなければなりません。

p  

符号なしの 16 進数として解釈します。この数字列は printf() によってできた、 p 変換文字である場合が多いと思われます。対応する引き数は、16 進数の数字列が格納される、 void 型へのポインターのポインターでなければなりません。この変換の動作は、現プログラムの実行中に、先に変換された値以外の入力項目に対しては定義されません。

変換文字 d, i および n は、 l, ll または h を先頭につけることにより、 int ではなく long int, long long int, または short int へのポインターが引き数リスト中にあることを示すことができます。同じように、変換文字 u, o, x および X は、 l または h を先頭につけることにより、 unsigned int ではなく unsigned long int, unsigned long long int または unsigned short int へのポインターが引き数リスト中にあることを示すことができます。最後に、変換文字 e, E, f, g および G は、 l または L を先頭に付けることにより、 float ではなく double または long double が引き数リスト中にあることを示すことができます。 l, ll, L または h 修飾子は、他の変換文字に対しては無視されます。

scanf() 関数は、 EOF , 制御文字列の終り、または入力文字が制御文字と矛盾した時に変換を終了します。最後のケースでは、矛盾した文字は入力ストリームにおいては読み飛ばされます。

多言語化対応

ロケール

LC_CTYPE カテゴリは、書式指定文字列の内の通常の文字をシングルバイト文字とマルチバイト文字の混合と解釈するかどちらかのみと解釈するかを定めます。フィールド幅はバイト単位で与えられます。入力ストリームから受け取った文字は、 LC_TYPE カテゴリによる指定に従って、半角または全角文字として解釈され、フィールド幅は文字の長さの分短くなります。

LC_NUMERIC カテゴリは、浮動小数点数の中に現れる小数点キャラクタを指定します。

サポートされるコードセット

シングル/マルチバイトの文字コードセットがサポートされています。

戻り値

最初の矛盾や変換が起きる前に入力が終了した場合には、戻り値として EOF を返します。その他の場合には、代入が正常終了した入力項目の数を返します。この値は、入力文字と制御文字の間で矛盾が生じた場合には、少なくなったり 0 になります。

エラー

scanf() および fscanf() は、 ストリーム バッファーにデータが読み込まれる必要がある時、あるいは以下のような場合には動作しません。

[EAGAIN] 

O_NONBLOCK フラグが、 ストリーム のファイル記述子としてセットされており、プロセスが読み込み動作において遅延がかかっているような場合

[EBADF] 

ストリーム のファイル記述子が読み込みのためにオープンされるファイル記述子として不適切な場合

[EINTR] 

シグナルの受信により読み込み動作が中断され、データが転送されなかったり、ファイルに対する部分の転送が実行されなかった場合

[EIO] 

プロセスがバックグランドプロセスの 1 つになっている時に、制御ターミナルからの読み込みを行おうとしており、さらにプロセスが SIGTTIN シグナルを無視またはブロックしているか、あるいはプロセスのプロセスグループが親なしになっている場合

[EILSEQ] 

入力ストリームから取得したデータは、有効なワイドキャラクタを構成しません。

特別の errno の値は優先する read() 関数 read(2) を参照) によってセットされることがあります。

下記の呼び出し

int i, n; float x; char name[50];
n = scanf("%d%f%s", &i, &x, name); 

に次のような入力があると、

25 54.32E-1 thompson

n には 3 が、 i には 25 が、 x には 5.432 が、 name には thompson\0 が代入されます。また、下記の呼び出し

int i; float x; char name[50];
(void) scanf("%2d%f%*d %[0-9]", &i, &x, name); 

に次のような入力があると、

56789 0123 56a72

56i に、 789.0x に代入し、 0123 をスキップして、文字列 56\0name に代入します。次に getchar() getc(3S) を参照) を呼び出すと、 a を返します。

もう 1 つの例として、言語に依存しない日付のスキャンを行うルーチンを示します。使い方は以下のとおりです。

char month[20]; int day, year;
(void) scanf(format, month, &day, &year);

アメリカ式の使い方では、 format は以下のような文字列を表します。

%1$s %2$d %3$d

次の入力があると、

July 3 1986

Julymonth に、 3day に、 1986year に代入します。

ドイツ式の使い方では、 format は以下の文字列を表します。

%2$d %1$s %3$d

次の入力があると、

  • 3 Juli 1986

Julimonth に、 3day に、 1986year に代入します。

文字の一致あるいは代入抑制は、 %n の変換の指定によって決定されます。以下に文字の一致をチェックする例を示します。

int i, n1, n2, n3, n4;
 
n1 = n2 = n3 = n4 = -1; 
scanf("%nBEGIN%n %d %nEND%n", &n1, &n2, &i, &n3, &n4); 
if (n2 - n1 == 5) puts( "matched BEGIN"); 
if (n4 - n3 == 3) puts(  matched END"); 

次の例は、代入抑制の成功をチェックするものです。

int i, n1, n2;
n1 = n2 = -1;
 
scanf( "%d %n%*s%n", &i, &n1, &n2); 
if (n2 > n1) 
    printf("successful assignment suppression of %d chars\n", n2-n1); 

アプリケーション使用法

scanf() または fscanf() がストリームに適用された後で、そのストリームはバイト指向になります (orientation(5) を参照)。

警告

後続の空白 (ニューライン文字を含む) は、制御文字列に一致しない限り読み飛ばされます。

マルチバイト文字は、フィールド幅が変換文字とともに用いられているときには、切り捨てられます。

著者

scanf() は、AT&T と HP で開発されました。

標準準拠

scanf(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1, ANSI C

fscanf(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1, ANSI C

sscanf(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1, ANSI C

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2004 Hewlett-Packard Development Company, L.P.