scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

標準入力ストリームから書式付きデータを読み取ります。 これらのバージョンの 、_wscanf_l_scanf_lwscanfCRTscanfセキュリティ機能で説明されているように、セキュリティが強化されています。

構文

int scanf_s(
   const char *format [,
   argument]...
);
int _scanf_s_l(
   const char *format,
   _locale_t locale [,
   argument]...
);
int wscanf_s(
   const wchar_t *format [,
   argument]...
);
int _wscanf_s_l(
   const wchar_t *format,
   _locale_t locale [,
   argument]...
);

パラメーター

format
書式指定文字列。

argument
省略可能な引数。

locale
使用するロケール。

戻り値

正常に変換され、割り当てられたフィールドの数を返します。 戻り値に、読み取られたが、割り当てられなかったフィールドは含まれません。 0 の戻り値は、フィールドが割り当てられなかったことを示します。 戻り値は EOF エラーの場合、または最初に文字を読み取ろうとしたときにファイルの終わり文字または文字列の終わり文字が見つかった場合です。 ポインターのNULL場合format、「パラメーターの検証」で説明されているように、無効なパラメーター ハンドラーが呼び出されます。 実行の継続が許可された場合、scanf_s および wscanf_sEOF を返し、errnoEINVAL に設定します。

これらのエラー コードおよびその他のエラー コードの詳細については、「errno_doserrno_sys_errlist_sys_nerr」を参照してください。

解説

scanf_s 関数は、標準入力ストリーム stdin からデータを読み取り、それを argument に書き込みます。 各 argument は、format 内の型指定子に対応する変数の型へのポインターである必要があります。 重なり合う文字列間でコピーした場合の動作は未定義です。

wscanf_s 関数は、 scanf_s関数のワイド文字バージョンです。 format 関数の引数 wscanf_s は、ワイド文字列です。 ストリームが ANSI モードで開かれている場合、wscanf_sscanf_s の動作は同じになります。 scanf_s では、UNICODE ストリームからの入力はサポートされていません。

サフィックスを持つ _l これらの関数のバージョンは同じですが、現在のスレッド ロケールの代わりにパラメーターを locale 使用する点が異なります。

scanfwscanf とは異なり、scanf_swscanf_s では、一部のパラメーターのバッファー サイズを指定する必要があります。 cCsS のすべてサイズ、または文字列コントロール セット [] パラメーターを指定します。 バッファー サイズ (文字数) は、別のパラメーターとして渡されます。 これは、バッファーまたは変数へのポインターの直後に指定されます。 たとえば、文字列を読み取っている場合、その文字列のバッファー サイズは次のように渡されます。

char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9

このバッファー サイズには終端の null が含まれます。 幅指定フィールドを使用すると、読み取られたトークンが確実にバッファー内に収まるようにすることができます。 トークンが大きすぎて収まらない場合は、幅指定がない限り、バッファーには何も書き込まれません。

Note

サイズ パラメーターは unsigned 型ではなく、size_t 型です。 静的キャストを使用して、64 ビットのビルド構成用に size_t 値を unsigned に変換します。

バッファー サイズ パラメーターでは、最大バイト数ではなく、最大文字数を指定します。 この例では、バッファーの型の幅が書式指定子の幅と一致していません。

wchar_t ws[10];
wscanf_s(L"%9S", ws, (unsigned)_countof(ws));

S の書式指定子は、この関数によってサポートされる既定の幅とは "反対の" 文字幅を使用することを示しています。 文字幅は 1 バイトですが、この関数は 2 バイト文字をサポートしています。 この例では、最大 9 つの 1 バイト幅文字の文字列を読み取り、それを 2 バイト幅文字バッファーに格納します。 文字は 1 バイト値として処理されます。したがって、最初の 2 文字は ws[0] に格納され、次の 2 文字は ws[1] に格納され、以降も同様に処理されます。

次の例では 1 文字を読み取ります。

char c;
scanf_s("%c", &c, 1);

null で終わらない文字列の複数の文字が読み取られる場合は、幅指定とバッファー サイズの両方に整数が使用されます。

char c[4];
scanf_s("%4c", c, (unsigned)_countof(c)); // not null terminated

詳細については、「scanf での文字幅指定」を参照してください。

汎用テキスト ルーチンのマップ

TCHAR.H ルーチン _UNICODE_MBCS が定義されていない _MBCS が定義されている _UNICODE が定義されている
_tscanf_s scanf_s scanf_s wscanf_s
_tscanf_s_l _scanf_s_l _scanf_s_l _wscanf_s_l

詳細については、「書式指定フィールド: scanf およびwscanf関数」を参照してください

必要条件

ルーチンによって返される値 必須ヘッダー
scanf_s, _scanf_s_l <stdio.h>
wscanf_s, _wscanf_s_l <stdio.h> または <wchar.h>

ユニバーサル Windows プラットフォーム (UWP) アプリではコンソールがサポートされていません。 UWP アプリで C ランタイム関数が標準ストリーム ハンドル stdinstdoutstderr を使用するには、それらを事前にリダイレクトしておく必要があります。 互換性の詳細については、「 Compatibility」を参照してください。

// crt_scanf_s.c
// This program uses the scanf_s and wscanf_s functions
// to read formatted input.

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
   int      i,
            result;
   float    fp;
   char     c,
            s[80];
   wchar_t  wc,
            ws[80];

   result = scanf_s( "%d %f %c %C %s %S", &i, &fp, &c, 1,
                     &wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_countof(ws) );
   printf( "The number of fields input is %d\n", result );
   printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c,
           wc, s, ws);
   result = wscanf_s( L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,
                      &wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_countof(ws) );
   wprintf( L"The number of fields input is %d\n", result );
   wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp,
            c, wc, s, ws);
}

この入力を使用すると、このプログラムでは次の出力が生成されます。

71 98.6 h z Byte characters
36 92.3 y n Wide characters
The number of fields input is 6
The contents are: 71 98.599998 h z Byte characters
The number of fields input is 6
The contents are: 36 92.300003 y n Wide characters

関連項目

数学と浮動小数点のサポート
ストリーム入出力
ロケール
fscanf, _fscanf_l, fwscanf, _fwscanf_l
printf, _printf_l, wprintf, _wprintf_l
sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l
sscanf, _sscanf_l, swscanf, _swscanf_l