scanf | Programming Place Plus C言語編 標準ライブラリのリファレンス

C言語編 標準ライブラリのリファレンス scanf

先頭へ戻る

scanf関数

概要 標準入力から、変換指定を伴った文字列を受け取る。
ヘッダ stdio.h
形式 int scanf(const char* format, ...);
引数 format 変換指定を伴った文字列。
... 入力された値を受け取るメモリアドレスの指定。format に含まれている変換指定子に対応した個数と型であること。
戻り値 変換を1つも行えないまま入力エラーが起きた場合は、EOF を返す。その他の場合には、正常に代入を行えた個数を返す。
詳細 入力された値が、可変個引数の部分に指定したメモリアドレスへ格納される。
入力が得られなかった場合や、表現できない文字が入力された場合は入力エラーが発生する。また、型が不適切であるような、不適切な入力が起こると照合エラーが発生する。
引数format の基本形式は、"%d" や "%s" といったように、指定の開始を意味する %記号と、変換指定子の組み合わせである。この指定の組み合わせ1つにつき、引数... の個数を1つ増やす。
変換指定子には以下のものがある。
d 符号付き 10進整数。
i 符号付き整数。
printf系の関数にある i変換指定子と異なり、d とは意味が違うことに注意。d が 10進整数のみ受け付けるのに対し、i は 先頭に 0 や 0x が付加された 8進数や 16進数の値も受け付ける。
u 符号無し 10進整数
o 符号無し 8進整数
x 符号無し 16進整数。
a-f が大文字・小文字のいずれであるかは問わない。したがって、printf系の関数にあるような X指定は無い。
f、e、g 符号付き 10進浮動小数点数。科学的記数法でも構わない。
printf系の関数と異なり、f、e、g はいずれも全く同じものである。
a f、e、g の各変換指定子と同一。C99規格で追加された。
printf系の関数で a が追加されたことに合わせて導入されたと思われる。
c 文字
s 文字列
p ポインタの表現形式に従って、void**型の実引数へ格納する。
例えば、sprintf関数の %p変換で、配列にポインタの値を文字列化した後、sscanf関数の %p変換で void*型の変数へ再変換できる。
n この変換指定が現れるまでに入力された文字数に変換され、対応する実引数(整数変数へのポインタでなければならない)に格納する。
[ 受け付けるべき文字を限定的にした文字列変換。"%[" から "]" の間に、受け付ける文字を書き並べる。
例えば、"%[abc]" という指定によって、'a'、'b'、'c' いずれかの文字で構成された文字列が、変数へ格納される。
また、[ の直後に ^ を置くことによって、書き並べた文字以外を受け付けるという否定的な意味に変わる。例えば、"%[^abc]" とすれば、'a'、'b'、'c' 以外の文字で構成された文字列が、変数へ格納される。
% "%%" というように 2つ並べることによって、%記号1つに変換される。

指定開始文字% の直後に、* を置いた場合、変数への格納が抑制される。例えば、"%*d %s" という指定に対して、「100 abc」という入力がなされた場合、%d 指定の効果によって、100 は読み取られるが、変数への格納は行われず、後続の %s変換へ進む。
任意で * を置いた直後には、最大フィールド幅の指定を置いても良い。これは、10進整数で指定し、変換結果が最大で何文字分の幅を取るかを意味する。例えば、"%10s" という指定によって、文字列を 10文字分まで読み取る。
任意で最大フィールド幅の指定を置いた直後には、変換修飾子を置いても良い。これには、以下のものがある。これらの指定は、変換指定子が n の場合には、対応する実引数が、どのような型へのポインタであるかを指示するという意味になる。
l 整数を変換する際、対象の型が long型または unsigned long型であることを指示する。また、変換指定子が n の場合は、対応する実引数の型が long* であることを指示する。
文字や文字列の場合( %[指定も含まれる)には、対象の型が wchar_t型であることを指示する。
浮動小数点数の場合には、対象の型が double型であることを指示する。特に、このケースは、printf系の関数では必要とされないが、scanf系の関数では必要であることに注意。
ll C99規格で追加された。
整数を変換する際、対象の型が long long型または unsigned long long型であることを指示する。また、変換指定子が n の場合は、対応する実引数の型が long long* であることを指示する。
浮動小数点数の場合には、対象の型が long double型であることを指示する。特に、このケースは、printf系の関数では必要とされないが、scanf系の関数では必要であることに注意。
h 整数を変換する際、対象の型が short型または unsigned short型であることを指示する。また、変換指定子が n の場合は、対応する実引数の型が short* であることを指示する。
hh C99規格で追加された。
整数を変換する際、対象の型が char型または unsigned char型であることを指示する。また、変換指定子が n の場合は、対応する実引数の型が char* であることを指示する。
L 浮動小数点数を変換する際、対象の型が long double型であることを指示する。
j C99規格で追加された。
整数を変換する際、対象の型が intmax_t型または uintmax_t型であることを指示する。また、変換指定子が n の場合は、対応する実引数の型が intmax_t* であることを指示する。
z C99規格で追加された。
整数を変換する際、対象の型が size_t型であることを指示する。また、変換指定子が n の場合は、対応する実引数の型が size_t* であることを指示する。
t C99規格で追加された。
整数を変換する際、対象の型が ptrdiff_t型であることを指示する。また、変換指定子が n の場合は、対応する実引数の型が ptrdiff_t* であることを指示する。

変換修飾子の直後には、変換指定子が来る。これは省略できない。
引数format の中で、空白類文字(半角スペースやタブ文字)は、複数の連続した空白類文字を無視することを表す。1文字の空白類文字を読み飛ばす目的で、"%d %d" のように、1文字の空白類文字を挟み込んでも、入力された文字列内で連続していれば全ての空白類文字は読み飛ばされる。
変換指定と合致しない内容の入力が現れた場合、その時点で関数は終了する。
注意 必要な個数の実引数が指定されていない場合の動作は未定義。余分に指定されている場合には、評価は行われるが、scanf関数としては無視する。
使用例
#include <stdio.h>

int main(void)
{
    int num;
    char str[80];
    char numbers[80];
    char no_numbers[80];

    /* 以下のいずれか1つを有効にして試すこと */
    /* 複数同時に試すと、入力の最後に現れる改行文字のために、正しく処理できない */
    /* 1度に試すのなら、それぞれの scanf関数の直後で、
           scanf( "%*[^\n]" );
       のようにして、実際に受け取った内容の直後から改行文字の直前までを読み飛ばし、
       更に、
           scanf( "%*c" );
       として、改行文字を読み飛ばすといった工夫が必要である。
    */

    scanf( "%d", &num );
    scanf( "%d %s", &num, str );            /* str が溢れる危険性あり */
    scanf( "%d %79s", &num, str );          /* str が溢れることはない */
    scanf( "%[0123456789]", numbers );      /* やはり numbers は溢れる危険性がある */
    scanf( "%[^0123456789]", no_numbers );  /* やはり no_numbers は溢れる危険性がある */
    scanf( "%79[0123456789]", numbers );    /* numbers が溢れることはない */

    return 0;
}

実行結果:


	
関連 任意のストリームに対して同様の変換指定を行い出力するには、fscanf関数を使う。対象が文字列の場合は sscanf関数が使える。
引数に ... ではなく、va_list を用いたバージョンとして、vscanf関数がある。
ワイド文字版の wscanf関数がある。
解説章 第7章


参考リンク



更新履歴

'2018/4/22 解説中で C95 を(C89 に対して)特別扱いしないように修正。そもそもC言語編は C95ベースなので、余計な説明は省く。

'2018/4/15 全体的に文章を見直し修正。

'2018/4/8 入力エラーと照合エラーについて追記。

'2018/2/1 C言語編全体で表記を統一するため、「フォーマット指定」を「変換指定」に、 「変換指定文字」を「変換指定子」に改めた。

'2018/1/22 新規作成。



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS