標準入力ストリームから書式付きデータを読み取ります。 これらのバージョンの scanf、 _scanf_l、 wscanf、 _wscanf_l には、CRT の セキュリティ機能の説明に従ってセキュリティが強化。
構文
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 されます。または、最初に文字を読み取ろうとしたときに、ファイルの終わり文字または文字列の終わり文字が見つかった場合です。 formatがNULL ポインターの場合、「パラメーターの検証で説明されているように、無効なパラメーター ハンドラーが呼び出されます。 実行の継続が許可された場合、scanf_s および wscanf_s は EOF を返し、errno を EINVAL に設定します。
これらのエラー コードおよびその他のエラー コードの詳細については、「errno、_doserrno、_sys_errlist、_sys_nerr」を参照してください。
解説
scanf_s 関数は、標準入力ストリーム stdin からデータを読み取り、それを argument に書き込みます。 各 argument は、format 内の型指定子に対応する変数の型へのポインターである必要があります。 重なり合う文字列間でコピーした場合の動作は未定義です。
wscanf_s 関数は、 scanf_s関数のワイド文字バージョンです。 format 関数の引数 wscanf_s は、ワイド文字列です。 ストリームが ANSI モードで開かれている場合、wscanf_s と scanf_s の動作は同じになります。 scanf_s では、UNICODE ストリームからの入力はサポートされていません。
_l サフィックスを持つこれらの関数のバージョンは同じですが、現在のスレッド ロケールの代わりに locale パラメーターを使用する点が異なります。
scanf や wscanf とは異なり、scanf_s と wscanf_s では、一部のパラメーターのバッファー サイズを指定する必要があります。 c、C、s、S のすべてサイズ、または文字列コントロール セット [] パラメーターを指定します。 バッファー サイズ (文字数) は、別のパラメーターとして渡されます。 これは、バッファーまたは変数へのポインターの直後に指定されます。 たとえば、文字列を読み取っている場合、その文字列のバッファー サイズは次のように渡されます。
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 |
詳細については、「 Format 仕様フィールド: scanf および wscanf 関数を参照してください。
要件
| ルーチンによって返される値 | 必須ヘッダー |
|---|---|
scanf_s, _scanf_s_l |
<stdio.h> |
wscanf_s, _wscanf_s_l |
<stdio.h> または <wchar.h> |
ユニバーサル Windows プラットフォーム (UWP) アプリではコンソールがサポートされていません。 UWP アプリで C ランタイム関数が標準ストリーム ハンドル stdin、stdout、stderr を使用するには、それらを事前にリダイレクトしておく必要があります。 互換性の詳細については、「 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