次の方法で共有


書式指定フィールド: scanf 関数と wscanf 関数

ここでの情報は、セキュリティで保護されたバージョンを含む、 scanf 関数ファミリ全体に適用されます。 入力ストリームstdinなどの入力ストリームをプログラム変数に挿入された値に解析する方法をscanf関数に指示するために使用されるシンボルについて説明します。

format引数は、入力の解釈を指定する文字列であり、次の 1 つ以上を含めることができます。

  • 空白文字: 空白 ( )、タブ (\t)、または改行 (\n)。 空白文字が現れると、scanf は、次の非空白文字が現れるまで、入力データ内の連続するすべての空白文字を読み取ります。ただし、読み取るだけで格納しません。 書式に指定された 1 つの空白文字は、入力データ内の任意の個数 (0 を含む) の空白文字および任意の組み合わせの空白文字と一致します。

  • パーセント記号 (%) 以外の非空白文字。 非空白文字が現れると、scanf 関数は、一致する非空白文字を読み取ります。ただし、読み取るだけで格納しません。 入力ストリーム内の次の文字が一致しない場合は、 scanf 終了します。

  • パーセント記号 (%) に続く書式指定。 書式指定により、 scanf は入力の文字を読み取り、指定した型の値に変換します。 変換後の値は、引数リスト内の引数に代入されます。

    書式指定は、次の形式で行います。

    %[*][width][{h|l|ll|I64|L}]type

    ここで、 widthhlllI64、および Lscanf width仕様を表しtypescanf 型フィールド文字を表します

format引数文字列は左から右に読み取られます。 書式指定外の文字は、入力ストリーム内の文字のシーケンスと一致することが想定されます。 入力ストリーム内の一致する文字はスキャンされますが、保存されません。 入力ストリーム内の文字が書式指定と競合する場合、 scanf は終了し、文字は読み取られていなかったかのように入力ストリームに残ります。

最初の書式指定が検出されると、最初の入力フィールドの値がこの仕様に従って変換されます。 この値は、 format 引数の後の最初の引数で指定された場所に格納されます。 2 番目の書式指定では、2 番目の入力フィールドが変換され、次の引数に格納され、書式指定文字列の末尾まで格納されます。

入力フィールドは、最初の空白文字 (スペース、タブ、または改行) まで、または書式指定に従って変換できない最初の文字まで、またはフィールド幅 (指定されている場合) に達するまでのすべての文字として定義されます。 書式指定に対して引数が多すぎる場合、余分な引数は評価されるだけで無視されます。 書式指定に十分な引数がない場合、結果は予測できません。

各書式指定フィールドには、特定の書式を表す 1 つの文字または数字を指定します。 type 文字は省略可能な最後の書式フィールドの次に指定し、入力フィールドを文字、文字列、または数値のうちいずれとして解釈するかを決定します。

最も簡単な書式指定は、パーセント記号と type 文字だけ (%s など) で行います。 パーセント記号 (%) の後に書式制御文字として意味のない文字が続く場合、その文字と次の文字 (次のパーセント記号まで) は通常の文字シーケンスとして扱われます。 つまり、入力と一致する必要がある文字のシーケンスとして扱われます。 パーセント記号を入力文字として処理するには、%% と指定します。

パーセント記号の後にアスタリスク (*) を指定すると、次の入力フィールドは指定されている型のフィールドとして解釈されますが、引数には代入されません。 フィールドはスキャンされますが、引数には格納されません。

scanf関数ファミリのセキュリティで保護されたバージョン (_s サフィックスを持つもの) には、直後にバッファー サイズ パラメーターを渡すために、cCsS、または[の各パラメーターが必要です。 scanf 系の関数のセキュリティが強化されたバージョンの詳細については、「scanf_s_scanf_s_lwscanf_s_wscanf_s_l」を参照してください。

関連項目

scanf 幅の指定
scanf フィールド文字の入力
scanf_scanf_lwscanf_wscanf_l
scanf_s_scanf_s_lwscanf_s_wscanf_s_l