scanf_s、_scanf_s_l、wscanf_s、_wscanf_s_lscanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

標準入力ストリームから書式付きデータを読み取ります。Reads formatted data from the standard input stream. これらのバージョンの scanf、_scanf_l、wscanf、_wscanf_l は、「CRT のセキュリティ強化」にあるとおり、セキュリティが強化されています。These versions of scanf, _scanf_l, wscanf, _wscanf_l have security enhancements, as described in Security Features in the CRT.

構文Syntax

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]...
);

パラメーターParameters

formatformat
書式指定文字列。Format control string.

argumentargument
省略可能な引数。Optional arguments.

localelocale
使用するロケール。The locale to use.

戻り値Return Value

正常に変換されて割り当てられたフィールドの数を返します。Returns the number of fields successfully converted and assigned. 戻り値には、読み取られたが割り当てられていないフィールドは含まれません。The return value doesn't include fields that were read but not assigned. 戻り値が0の場合は、フィールドが割り当てられていないことを示します。A return value of 0 indicates no fields were assigned. 戻り値は、エラーの場合は EOF 、ファイルの終端文字または文字列の末尾の文字が最初に文字を読み取ろうとしたときに見つかった場合はです。The return value is EOF for an error, or if the end-of-file character or the end-of-string character is found in the first attempt to read a character. FormatNULL ポインターの場合は、「パラメーターの検証」で説明されているように、無効なパラメーターハンドラーが呼び出されます。If format is a NULL pointer, the invalid parameter handler is invoked, as described in Parameter Validation. 実行の継続が許可された場合、 scanf_swscanf_sEOF を返し、 errnoEINVAL に設定します。If execution is allowed to continue, scanf_s and wscanf_s return EOF and set errno to EINVAL.

エラー コードの詳細については、「errno、_doserrno、_sys_errlist、および _sys_nerr」を参照してください。For information about these and other error codes, see errno, _doserrno, _sys_errlist, and _sys_nerr.

解説Remarks

Scanf_s 関数は、標準入力ストリーム ( stdin) からデータを読み取り、それを 引数 に書き込みます。The scanf_s function reads data from the standard input stream, stdin, and writes it into argument. 引数 は、 形式 の型指定子に対応する変数型へのポインターである必要があります。Each argument must be a pointer to a variable type that corresponds to the type specifier in format. 重なり合う文字列間でコピーした場合の動作は未定義です。If copying occurs between strings that overlap, the behavior is undefined.

wscanf_sscanf_s のワイド文字バージョンです。wscanf_sformat 引数は、ワイド文字列です。wscanf_s is a wide-character version of scanf_s; the format argument to wscanf_s is a wide-character string. ストリームが ANSI モードで開かれている場合、 wscanf_sscanf_s は同じように動作します。wscanf_s and scanf_s behave identically if the stream is opened in ANSI mode. scanf_s は、UNICODE ストリームからの入力を現在サポートしていません。scanf_s doesn't currently support input from a UNICODE stream.

_L サフィックスを持つこれらの関数のバージョンは同じですが、現在のスレッドロケールの代わりに locale パラメーターを使用する点が異なります。The versions of these functions that have the _l suffix are identical, except they use the locale parameter instead of the current thread locale.

Scanfwscanf とは異なり、 scanf_swscanf_s では、一部のパラメーターに対してバッファーサイズを指定する必要があります。Unlike scanf and wscanf, scanf_s and wscanf_s require you to specify buffer sizes for some parameters. すべての ccss、または文字列コントロールセットの [] パラメーターのサイズを指定します。Specify the sizes for all c, C, s, S, or string control set [] parameters. 文字単位のバッファーサイズは、追加のパラメーターとして渡されます。The buffer size in characters is passed as an additional parameter. バッファーまたは変数へのポインターの直後に続きます。It immediately follows the pointer to the buffer or variable. たとえば、文字列を読み取る場合、その文字列のバッファーサイズは次のように渡されます。For example, if you're reading a string, the buffer size for that string is passed as follows:

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

バッファーサイズには、ターミナルの null が含まれます。The buffer size includes the terminal null. [幅指定] フィールドを使用して、読み取られたトークンがバッファーに確実に収まるようにすることができます。You can use a width specification field to ensure the token that's read in fits into the buffer. トークンが大きすぎて収まりきらない場合、幅指定がない限り、バッファーには何も書き込まれません。When a token is too large to fit, nothing is written to the buffer unless there's a width specification.

注意

Size パラメーターの型は unsigned であり、 size_t ではありません。The size parameter is of type unsigned, not size_t. 静的なキャストを使用し unsigned て、64ビットのビルド構成の size_t 値をに変換します。Use a static cast to convert a size_t value to unsigned for 64-bit build configurations.

バッファーサイズのパラメーターは、バイトではなく最大文字数を示します。The buffer size parameter describes the maximum number of characters, not bytes. この例では、バッファーの種類の幅が書式指定子の幅と一致しません。In this example, the width of the buffer type doesn't match the width of the format specifier.

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

S 書式指定子は、関数によってサポートされる既定の幅の "反対" の文字幅を使用することを意味します。The S format specifier means use the character width that's "opposite" the default width supported by the function. 文字幅は1バイトですが、関数は2バイト文字をサポートします。The character width is single byte, but the function supports double-byte characters. この例では、最大9つの1バイトワイド文字の文字列を読み取り、2バイト幅の文字バッファーに格納します。This example reads in a string of up to nine single-byte-wide characters and puts them in a double-byte-wide character buffer. 文字は 1 バイト値として処理されます。したがって、最初の 2 文字は ws[0] に格納され、次の 2 文字は ws[1] に格納され、以降も同様に処理されます。The characters are treated as single-byte values; the first two characters are stored in ws[0], the second two are stored in ws[1], and so on.

この例では、1つの文字を読み取ります。This example reads a single character:

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

Null で終わらない文字列に対して複数の文字を読み取る場合、幅指定とバッファーサイズの両方に整数が使用されます。When multiple characters for non-null-terminated strings are read, integers are used for both the width specification and the buffer size.

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

詳細については、「scanf 関数の文字幅指定」を参照してください。For more information, see scanf Width Specification.

汎用テキスト ルーチンのマップGeneric-Text Routine Mappings

TCHAR.H のルーチンTCHAR.H routine _UNICODE および _MBCS が未定義の場合_UNICODE & _MBCS not defined _MBCS が定義されている場合_MBCS defined _UNICODE が定義されている場合_UNICODE defined
_tscanf_s_tscanf_s scanf_sscanf_s scanf_sscanf_s wscanf_swscanf_s
_tscanf_s_l_tscanf_s_l _scanf_s_l_scanf_s_l _scanf_s_l_scanf_s_l _wscanf_s_l_wscanf_s_l

詳細については、「scanf 関数と wscanf 関数の書式指定フィールド」を参照してください。For more information, see Format Specification Fields: scanf and wscanf Functions.

必要条件Requirements

ルーチンによって返される値Routine 必須ヘッダーRequired header
scanf_s_scanf_s_lscanf_s, _scanf_s_l <stdio.h>
wscanf_s_wscanf_s_lwscanf_s, _wscanf_s_l <stdio.h> または <wchar.h><stdio.h> or <wchar.h>

コンソールは、ユニバーサル Windows プラットフォーム (UWP) アプリではサポートされていません。The console isn't supported in Universal Windows Platform (UWP) apps. 標準ストリームは、C ランタイム関数が UWP アプリで使用できるようにするために、 stdinstdoutstderr を処理する必要があります。The standard stream handles stdin, stdout, and stderr must be redirected before C run-time functions can use them in UWP apps. 互換性の詳細については、「互換性」を参照してください。For additional compatibility information, see Compatibility.

Example

// 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);
}

この入力を使用すると、このプログラムでは次の出力が生成されます。This program produces the following output when given this input:

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

関連項目See also

浮動小数点のサポートFloating-Point Support
ストリーム入出力Stream I/O
ロケールLocale
fscanf、_fscanf_l、fwscanf、_fwscanf_lfscanf, _fscanf_l, fwscanf, _fwscanf_l
printf、_printf_l、wprintf、_wprintf_lprintf, _printf_l, wprintf, _wprintf_l
sprintf、_sprintf_l、swprintf、_swprintf_l、 _ _swprintf_lsprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l
sscanf、_sscanf_l、swscanf、_swscanf_lsscanf, _sscanf_l, swscanf, _swscanf_l