Namespaces
Variants

scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s

From cppreference.net
< c ‎ | io
ヘッダーで定義 <stdio.h>
(1)
int scanf ( const char * format, ... ) ;
(C99まで)
int scanf ( const char * restrict format, ... ) ;
(C99から)
(2)
int fscanf ( FILE * stream, const char * format, ... ) ;
(C99まで)
int fscanf ( FILE * restrict stream, const char * restrict format, ... ) ;
(C99から)
(3)
int sscanf ( const char * buffer, const char * format, ... ) ;
(C99まで)
int sscanf ( const char * restrict buffer, const char * restrict format, ... ) ;
(C99から)
int scanf_s ( const char * restrict format, ... ) ;
(4) (C11から)
int fscanf_s ( FILE * restrict stream, const char * restrict format, ... ) ;
(5) (C11から)
int sscanf_s ( const char * restrict buffer, const char * restrict format, ... ) ;
(6) (C11から)

様々なソースからデータを読み取り、 format に従って解釈し、結果を指定された場所に格納します。

1) stdin からデータを読み取る
2) ファイルストリーム stream からデータを読み取る
3) null終端文字列 buffer からデータを読み取る。文字列の終端に到達することは、 fscanf にとってファイル終端条件に到達することと等価である。
4-6) (1-3) と同様であるが、以下の点が異なる: % c % s 、および % [ 変換指定子はそれぞれ2つの引数を期待する(通常のポインタと、受信配列のサイズを示す rsize_t 型の値。 % c で単一のcharに読み込む場合は 1 となる)。また、以下のエラーが実行時に検出され、現在インストールされている 制約ハンドラ 関数を呼び出す:
  • ポインタ型の引数のいずれかがnullポインタである場合
  • format stream または buffer がnullポインタである場合
  • % c % s または % [ によって書き込まれる文字数(終端ナル文字を含む)が、各変換指定子に提供された2番目( rsize_t )の引数を超える場合
  • オプションで、未知の変換指定子など、その他の検出可能なエラー
すべての境界チェック付き関数と同様に、 scanf_s fscanf_s 、および sscanf_s は、実装によって __STDC_LIB_EXT1__ が定義されており、かつユーザーが <stdio.h> をインクルードする前に __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ利用可能であることが保証される。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Parameters、Return value、Complexity、Notes、Example、References、See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、IDは一切変更していません - 数値や記号類はそのまま保持しました - フォーマットと構造は完全に維持しています

パラメータ

stream - 読み取り元の入力ファイルストリーム
buffer - 読み取り元のヌル終端文字列へのポインタ
format - 入力読み取り方法を指定するヌル終端文字列へのポインタ
... - 受信引数


format 文字列は以下で構成されます

  • 空白文字以外のマルチバイト文字( % を除く): 書式文字列内の各文字は入力ストリームから正確に同一の文字1文字を消費する。ストリーム上の次の文字が等しくない場合、関数は失敗する。
  • 空白文字: 書式文字列内の単一の空白文字は、入力から利用可能な連続する全ての空白文字を消費する(ループで isspace を呼び出して判定される)。 " \n " " " " \t \t " など、書式文字列内の空白文字の種類による違いはない。
  • 変換指定子。各変換指定子は以下の形式をとる:
  • 導入部 % 文字。
  • (オプション) 代入抑制文字 * 。このオプションが存在する場合、関数は変換結果を受取り引数に代入しません。
  • (オプション) ゼロより大きい整数値で、 最大フィールド幅 を指定します。これは現在の変換指定子によって指定された変換を行う際に関数が消費できる最大文字数を示します。 % s および % [ は、幅が指定されていない場合バッファオーバーフローを引き起こす可能性があることに注意してください。
  • (optional) 長さ修飾子 は、受信引数(実際の変換先の型)のサイズを指定します。これは変換精度とオーバーフロー規則に影響します。デフォルトの変換先型は変換指定子ごとに異なります(下記の表を参照)。
  • 変換フォーマット指定子。

以下のフォーマット指定子が利用可能です:

変換指定子
説明 期待される
引数の型
長さ修飾子→ hh h なし l ll j z t L
C99以降でのみ利用可能→
%
リテラルの % に一致します。
N/A N/A N/A N/A N/A N/A N/A N/A N/A
c

文字または文字のシーケンスにマッチします。

  • 幅指定子が使用される場合、正確に width 文字にマッチします(引数は十分な領域を持つ配列へのポインタでなければなりません)。
  • %sや%[とは異なり、配列にnull文字を追加しません。
N/A N/A
char *
wchar_t *
N/A N/A N/A N/A N/A
s

空白以外の文字の連続( 文字列 )にマッチします。

  • 幅指定子が使用されている場合、 width まで、または最初の空白文字のいずれか先に現れる方にマッチします。
  • 常にマッチした文字に加えてヌル文字を格納します(そのため、引数の配列には少なくとも width+1 文字分の領域が必要です)。
[ set  ]

set 内の文字からなる空でない文字シーケンスにマッチします。

  • セットの最初の文字が ^ の場合、セットに含まれないすべての文字がマッチします。
  • セットが ] または ^] で始まる場合、 ] 文字もセットに含まれます。
  • スキャンセット内の先頭以外の位置にある - 文字が [0-9] のように範囲を示すかどうかは実装定義です。
  • 幅指定子が使用されている場合、最大 width 文字までマッチします。
  • 常にマッチした文字に加えてnull文字を格納します(したがって、引数配列には少なくとも width+1 文字分の領域が必要です)。
d

10進整数 にマッチします。

  • 数値の形式は、 strtol 関数が 10 base 引数として期待する形式と同じです。
signed char * または unsigned char *
signed short * または unsigned short *
signed int * または unsigned int *
signed long * または unsigned long *
signed long long * または unsigned long long *
該当なし
i

整数 にマッチします。

  • 数値のフォーマットは、 strtol 0 base 引数として期待するものと同じです(基数は解析された最初の文字によって決定されます)。
u

符号なし 10進整数 にマッチします。

  • 数値のフォーマットは、 strtoul 関数が 10 base 引数として期待する形式と同じです。
o

符号なし 8進整数 にマッチします。

  • 数値の形式は、 strtoul 関数で 8 base 引数として指定した場合と同じ形式です。
x
X

符号なし 16進数整数 にマッチします。

  • 数値のフォーマットは、 strtoul 関数が 16 base 引数として期待する形式と同じです。
n

これまでに読み取られた 文字数を返します

  • 入力は消費されません。代入カウントは増加しません。
  • 指定子に代入抑制演算子が定義されている場合、動作は未定義です。
a (C99)
A (C99)
e
E
f
F (C99)
g
G

浮動小数点数 にマッチします。

  • 数値のフォーマットは strtof が期待する形式と同じです。
該当なし 該当なし
float *
double *
該当なし 該当なし 該当なし 該当なし
long double *
p

実装定義の文字シーケンスにマッチし、 ポインタ を定義します。

  • printf 関数群は同じシーケンスを %p フォーマット指定子を使用して生成する必要があります。
N/A N/A
void **
N/A N/A N/A N/A N/A N/A
注記

n 以外のすべての変換指定子について、指定されたフィールド幅を超えず、かつ変換指定子が期待する文字列と完全に一致するか、期待する文字列の接頭辞であるような入力文字の最長シーケンスがストリームから消費されます。この消費されたシーケンスの後の最初の文字(存在する場合)は読み取り済みとなりません。消費されたシーケンスの長さがゼロである場合、または消費されたシーケンスが上記のように変換できない場合、マッチング失敗が発生します。ただし、ストリームからの入力がEOF、エンコーディングエラー、または読み取りエラーによって妨げられた場合は入力失敗となります。

[ c n 以外のすべての変換指定子は、入力を解析する前に先行するすべての空白文字( isspace を呼び出して判定される)を消費して破棄します。これらの消費された文字は指定された最大フィールド幅にカウントされません。

変換指定子 lc ls l [ は、最初の文字が変換される前にゼロに初期化された mbstate_t オブジェクトを使用して mbrtowc を呼び出すかのように、マルチバイトからワイド文字への変換を実行します。

変換指定子 s [ は、常に一致した文字に加えてナルターミネータを格納します。変換先配列のサイズは、指定されたフィールド幅より少なくとも1大きくなければなりません。変換先配列のサイズを指定せずに % s または % [ を使用することは、 gets と同じくらい安全ではありません。

固定幅整数型 int8_t など)に対する正しい変換指定はヘッダ <inttypes.h> で定義されています(ただし SCNdMAX SCNuMAX などは % jd % ju などと同義です)。

各変換指定子の動作の後に シーケンスポイント が存在します。これにより、複数のフィールドを同じ「シンク」変数に格納することが可能になります。

指数部で終わるが数字がない不完全な浮動小数点値(例えば "100er" を変換指定子 % f で解析する場合)を解析するとき、 "100e" (有効な浮動小数点数の可能性のある最長の接頭辞)が消費され、マッチングエラー(消費されたシーケンスを浮動小数点数に変換できない)が発生し、 "r" が残ります。既存の実装の中にはこの規則に従わず、 "100" のみを消費するようにロールバックし、 "er" を残すものもあります(例: glibc bug 1765 )。

変換指定が無効な場合、動作は未定義です。

変換指定が無効な場合、動作は未定義です。

戻り値

1-3) 正常に代入された受信引数の数(最初の受信引数が代入される前にマッチング失敗が発生した場合はゼロとなる場合がある)、または最初の受信引数が代入される前に入力失敗が発生した場合は EOF が返される。
4-6) (1-3) と同様だが、実行時制約違反がある場合にも EOF が返される点が異なる。

計算量

保証されていません。特に、 sscanf の一部の実装は O(N) であり、ここで N = strlen ( buffer ) [1] です。

注記

ほとんどの変換指定子は最初に連続する空白文字をすべて読み飛ばすため、次のようなコードは

scanf("%d", &a);
scanf("%d", &b);

異なる行で入力された2つの整数(2つ目の % d が最初の入力で残された改行を消費する)または、同じ行でスペースやタブで区切られた2つの整数(2つ目の % d がスペースやタブを消費する)を読み取ります。

The conversion specifiers that do not consume leading whitespace, such as % c , can be made to do so by using a whitespace character in the format string:
scanf("%d", &a);
scanf(" %c", &c); // %dの後に続く連続する空白文字をすべて消費し、その後charを読み込む

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stddef.h>
#include <locale.h>
int main(void)
{
    int i, j;
    float x, y;
    char str1[10], str2[4];
    wchar_t warr[2];
    setlocale(LC_ALL, "en_US.utf8");
    char input[] = "25 54.32E-1 Thompson 56789 0123 56ß水";
    /* 以下のように解析:
       %d: 整数
       %f: 浮動小数点値
       %9s: 最大9文字の空白以外の文字列
       %2d: 2桁の整数(桁5と6)
       %f:  浮動小数点値(桁7、8、9)
       %*d: どこにも保存されない整数
       ' ': 連続するすべての空白
       %3[0-9]: 最大3桁の10進数字列(桁5と6)
       %2lc: 2つのワイド文字、マルチバイトからワイド変換を使用  */
    int ret = sscanf(input, "%d%f%9s%2d%f%*d %3[0-9]%2lc",
                     &i, &x, str1, &j, &y, str2, warr);
    printf("Converted %d fields:\n"
           "i = %d\n"
           "x = %f\n"
           "str1 = %s\n"
           "j = %d\n"
           "y = %f\n"
           "str2 = %s\n"
           "warr[0] = U+%x\n"
           "warr[1] = U+%x\n",
           ret, i, x, str1, j, y, str2, warr[0], warr[1]);
#ifdef __STDC_LIB_EXT1__
    int n = sscanf_s(input, "%d%f%s", &i, &x, str1, (rsize_t)sizeof str1);
    // iに25、xに5.432、str1に9バイト"Thompson\0"を書き込み、nに3を設定
#endif
}

出力例:

Converted 7 fields:
i = 25
x = 5.432000
str1 = Thompson
j = 56
y = 789.000000
str2 = 56
warr[0] = U+df
warr[1] = U+6c34

参考文献

  • C17規格 (ISO/IEC 9899:2018):
  • 7.21.6.2 fscanf関数 (p: 231-236)
  • 7.21.6.4 scanf関数 (p: 236-237)
  • 7.21.6.7 sscanf関数 (p: 238-239)
  • K.3.5.3.2 fscanf_s関数 (p: 430-431)
  • K.3.5.3.4 scanf_s関数 (p: 432)
  • K.3.5.3.7 sscanf_s関数 (p: 433)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.21.6.2 fscanf関数 (p: 317-324)
  • 7.21.6.4 scanf関数 (p: 325)
  • 7.21.6.7 sscanf関数 (p: 326)
  • K.3.5.3.2 fscanf_s関数 (p: 592-593)
  • K.3.5.3.4 scanf_s関数 (p: 594)
  • K.3.5.3.7 sscanf_s関数 (p: 596)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.19.6.2 fscanf関数 (p: 282-289)
  • 7.19.6.4 scanf関数 (p: 290)
  • 7.19.6.7 sscanf関数 (p: 291)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.9.6.2 fscanf関数
  • 4.9.6.4 scanf関数
  • 4.9.6.6 sscanf関数

関連項目

(C99) (C99) (C99) (C11) (C11) (C11)
可変長引数リストを使用して stdin 、ファイルストリーム、またはバッファから
書式付き入力を読み取る
(関数)
ファイルストリームから文字列を取得する
(関数)
stdout 、ファイルストリーム、またはバッファに
書式付き出力を書き込む
(関数)
C++ documentation for scanf , fscanf , sscanf