scanf での幅指定

この情報は、scanf_s など、安全なバージョンを含む scanf 関数ファミリの書式指定文字列の解釈に適用されます。 これらの関数は通常、入力ストリームが一連のトークンに分割されていることを前提とします。 トークンは空白 (スペース、タブ、または改行文字) で区切られるか、数値型の場合は数値テキストに変換できない最初の文字で示される数値データ型の自然な終了で区切られます。 ただし、幅指定を使用すると、トークンの自然な終了の前に入力の解析が停止することがあります。

width の指定は、% と型フィールド指定子 (width フィールドと呼ばれる正の整数を含む) との間の文字と、フィールドのサイズを示す 1 つ以上の文字で構成されます。後者は、整数型が short または long のどちらであるかを示すなどの、フィールドの型の修飾子ともみなされます。 このような文字はサイズのプレフィックスと呼ばれます。

width フィールド

width フィールドは、そのフィールドで読み取られる最大文字数を制御する正の 10 進整数です。 width 文字を超える文字は変換されず、対応する argument に格納されません。 空白文字または指定の書式に応じて変換できない文字がある場合、width に達するまでは、width より少ない文字が読み取られます。

幅の指定は、これらの関数の安全なバージョン (scanf_swscanf_s など) に必要なバッファー サイズ引数とは別に区別されています。 次の例では、幅指定は 20 であり、入力ストリームから 20 文字までが読み取られることを示してます。 バッファー長は 21 であり、入力可能な 20 文字の空きと、null 終端文字が含まれています。

char str[21];
scanf_s("%20s", str, 21);

width フィールドが使用されていない場合、scanf_s ではトークン全体をこの文字列に読み取ろうとします。 指定されたサイズがトークン全体を保持するために十分な大きさではない場合、コピー先文字列には何も書き込まれません。 width フィールドが指定されている場合、トークン内の最初の width 文字が null 終端文字と共にコピー先文字列に書き込まれます。

サイズ プレフィックス

省略可能なプレフィックス hhhlllI64Largument (変更した型文字に応じて、long または short、1 バイト文字またはワイド文字) のサイズを示しています。 これらの書式指定文字列は、scanf または wscanf 関数で使用され、次の表に示す引数の解釈を指定します。 型プレフィックス I64 は Microsoft の拡張機能であり、Standard C と互換性がありません。型の文字とその意味は、型フィールド文字の "scanf 関数の型文字" テーブルで scanf 説明されています

Note

hlL プレフィックスは、char データ型で使用するときの Microsoft の拡張機能です。

scanf および wscanf 書式型指定子のサイズ プレフィックス

指定する型 プリフィックス 型指定子
double l eEfg、または G
long double (double と同じ) L eEfg、または G
long int l diox、または X
long unsigned int l u
long long ll diox、または X
short int h diox、または X
short unsigned int h u
char hh diox、または X
unsigned char hh u
int64 I64 dioux、または X
1 バイト文字と scanf h c または C
1 バイト文字と wscanf h c または C
ワイド文字と scanf l c または C
ワイド文字と wscanf l c または C
1 バイト文字列と scanf h s または S
1 バイト文字列と wscanf h s または S
ワイド文字列と scanf l s または S
ワイド文字列と wscanf l s または S

次の例では、hlscanf_s 関数と wscanf_s 関数で使用します。

scanf_s("%ls", &x, 2);     // Read a wide-character string
wscanf_s(L"%hC", &x, 2);    // Read a single-byte character

scanf ファミリの安全でない関数を使用する場合は、前の引数のバッファー長を示すサイズ パラメーターを省略します。

区切られていない文字列の読み取り

空白文字で区切られていない文字列を読み取るには、角かっこ ([ ]) 内の文字セットを s (文字列) 型の文字に代用できます。 角かっこ内の文字のセットは、"制御文字列" と呼ばれます。 対応する入力フィールドは、制御文字に表示されない最初の文字まで読み取られます。 セット内の最初の文字がカレット (^) の場合、効果は逆になり、入力フィールドは文字セットの残りの部分に表示される最初の文字までが読み取られます。

%[a-z]%[z-a]%[abcde...z] と同等のものと解釈されます。 これは一般的な scanf 関数の拡張機能ですが、標準 C では必要ありません。

未終了の文字列の読み取り

終端の null 文字 ('\0') を保存せずに文字列を保存するには、%Nc を指定します。ここでは N は 10 進整数です。 この場合、c の型文字は引数が文字配列へのポインターであることを示します。 次の N 文字が入力ストリームから指定した場所に読み取られ、null 文字 ('\0') は追加されません。 N が指定されていない場合、この既定値は 1 です。

scanf でフィールドの読み取りを停止するタイミング

scanf関数は文字単位で入力フィールドをスキャンします。 いくつかある理由のいずれかから、空白文字に達する前に特定の入力フィールドで読み取りが停止することがあります。

  • 指定した幅に到達しました。

  • 次の文字を指定のとおり変換できません。

  • 次の文字が、一致するはずの制御文字列内の文字と競合しています。

  • 次の文字が特定の文字セットに表示されません。

理由に関係なく、scanf 関数が入力フィールドの読み取りを停止すると、次の入力フィールドは、最初の未読文字から始まるとみなされます。 競合する文字がある場合は、未読と見なされます。 これは、次の入力フィールドの最初の文字、または入力ストリームに対する後続の読み取り操作の最初の文字です。

関連項目

scanf, _scanf_l, wscanf, _wscanf_l
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l
書式指定フィールド: scanf および wscanf 関数
scanf type フィールドの文字