scanf、wscanf

標準入力ストリームから書式付きデータを読み取ります。

int scanf(
   const char *format [,
 argument]... 
);
int wscanf(
   const wchar_t *format [,
 argument]... 
);

パラメータ

  • format
    書式指定文字列。
  • argument
    省略可能な引数。

戻り値

正常に変換され、代入されたフィールドの数を返します。この数には、読み取られても代入されなかったフィールドは含まれません。戻り値が 0 の場合は、代入されたフィールドがなかったことを示します。エラーが発生した場合や、まだ文字を読み取っていないときにファイルの終端文字または文字列の終端文字が検出された場合は、EOF (end-of-file) を返します。

解説

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

セキュリティに関するメモ   scanf で文字列を読み取る場合は、書式が %s の桁数を必ず指定してください。たとえば、"%s" ではなく、"32%s" と指定します。指定しなかった場合は、入力の書式が正しく指定されず、バッファ オーバーランが発生しやすくなります。または、fgets の使用を検討してください。

ワイド文字を扱う場合は、scanf 関数ではなく wscanf 関数を使用します。wscanf 関数の場合、引数 format にはワイド文字列を指定します。引数の指定以外では、wscanf 関数と scanf 関数の動作は同じです。

ジェネリック テキスト ルーチンの割り当て

TCHAR.H のルーチン _UNICODE および _MBCS が未定義の場合 _MBCS が定義されている場合 _UNICODE が定義されている場合
_tscanf scanf scanf wscanf

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

必要条件

ルーチン 必須ヘッダー 互換性
scanf <stdio.h> ANSI、Win 98、Win Me、Win NT、Win 2000、Win XP
wscanf <stdio.h> または <wchar.h> ANSI、Win 98、Win Me、Win NT、Win 2000、Win XP

互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。

ライブラリ

C ランタイム ライブラリのすべてのバージョン。

// crt_scanf.c
 /* This program uses the scanf and wscanf functions
  * to read formatted input.
  */

#include <stdio.h>

int main( void )
{
   int   i, result;
   float fp;
   char  c, s[81];
   wchar_t wc, ws[81];
   result = scanf( "%d %f %c %C %80s %80S", &i, &fp, &c, &wc, s, 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( L"%d %f %hc %lc %80S %80ls", &i, &fp, &c, &wc, s, 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 | printf | sprintf | sscanf | ランタイム ルーチンおよび同等の .NET Framework 関数