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

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

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


scanf関数 🔗

概要 標準入力から、変換指定を伴った文字列を受け取る。
ヘッダ stdio.h
形式 int scanf(const char* restrict format, …);
引数 format 変換指定を伴った文字列。
入力された値を受け取るメモリアドレスの指定。format に含まれている変換指定子に対応した個数と型であること。
戻り値 変換を1つも行えないまま入力エラーが起きた場合は、EOF を返す。その他の場合には、正常に代入を行えた個数を返す。
詳細

入力された値が、可変個引数の部分に指定したメモリアドレスへ格納される。


入力が得られなかった場合や、表現できない文字が入力された場合は入力エラーが発生する。また、型が不適切であるような、不適切な入力が起こると照合エラーが発生する。


引数format の基本形式は、“%d” や “%s” といったように、指定の開始を意味する %記号と、変換指定子の組み合わせである。この指定の組み合わせ1つにつき、引数… の個数を1つ増やす。


変換指定子には以下のものがある。対応する実引数の型はデフォルトのものであり、後述する変換修飾子によって変化する。

変換指定子 意味 対応する実引数の型
d 符号付き 10進整数 int型へのポインタ型
i 符号付き整数。printf系の関数にある i変換指定子と違って、d と意味が異なる。d が 10進整数のみ受け付けるのに対し、i は 先頭に 0 や 0x が付加された 8進数や 16進数の値も受け付ける。 int型へのポインタ型
u 符号無し 10進整数 unsigned int型へのポインタ型
o 符号無し 8進整数 unsigned int型へのポインタ型
x 符号無し 16進整数。a-f が大文字か小文字かは問わない。printf系の関数にあるような X指定はない。 unsigned int型へのポインタ型
(C23) b 符号無し 2進整数 unsigned int型へのポインタ型
a、f、e、g 符号付き 10進浮動小数点数。科学的記数法でも構わない。printf系の関数と異なり、f、e、g はいずれもまったく同じものである。 float型へのポインタ型
c 文字 char、signed char、unsigned char、void のいずれかへのポインタ型
s 文字列 char、signed char、unsigned char、void のいずれかへのポインタ型
p ポインタの表現形式にしたがって、実引数へ格納する。たとえば、sprintf関数の %p変換で、配列にポインタの値を文字列化した後、sscanf関数の %p変換で void*型の変数へ再変換できる。 void**
n この変換指定が現れるまでに入力された文字数に変換され、対応する実引数に格納する。 符号付き整数型へのポインタ型
[ 受け付けるべき文字を限定的にした文字列変換。“%[” から “]” の間に、受け付ける文字を書き並べる。たとえば、“%[abc]” という指定によって、‘a’、‘b’、‘c’ いずれかの文字で構成された文字列を対応する実引数へ格納する。
また、[ の直後に ^ を置くことによって、書き並べた文字以外を受け付けるという否定的な意味に変わる。たとえば、“%[^abc]” とすれば、‘a’、‘b’、‘c’ 以外の文字で構成された文字列が、変数へ格納される。
char、signed char、unsigned char、void のいずれかへのポインタ型
% “%%” というように 2つ並べることによって、%記号1つに変換される。


指定開始文字% の直後に、* を置いた場合、変数への格納が抑制される。たとえば、“%*d %s” という指定に対して、「100 abc」という入力がなされた場合、%d 指定の効果によって、100 は読み取られるが、変数への格納は行われず、後続の %s変換へ進む。


任意で * を置いた直後には、最大フィールド幅の指定を置いても良い。これは 10進整数で指定し、変換結果が最大で何文字分の幅を取るかを意味する。たとえば、“%10s” という指定によって、文字列を 10文字分まで読み取る。


任意で最大フィールド幅の指定を置いた直後に以下の変換修飾子を指定してもよく、このさらに後続に続く変換指定子が、対応する実引数にどのように適用されるかを指示する。

変換修飾子 続く変換指定子 対応する実引数の型
hh d、i、n signed char型へのポインタ型
b、B、o、u、x、X unsigned char型へのポインタ型
h d、i、n short型へのポインタ型
b、B、o、u、x、X unsigned short型へのポインタ型
l d、i、n long型へのポインタ型
b、B、o、u、x、X unsigned long型へのポインタ型
a、A、e、E、f、F、g、G double型へのポインタ型
c、s、[ wchar_t型へのポインタ型
ll d、i、n long long型へのポインタ型
b、B、o、u、x、X unsigned long long型へのポインタ型
j d、i、n intmax_t型へのポインタ型
b、B、o、u、x、X uintmax_t型へのポインタ型
z d、i、n size_t型に対応する符号付き整数型へのポインタ型
b、B、o、u、x、X size_t型へのポインタ型
t d、i、n ptrdiff_tへのポインタ型
b、B、o、u、x、X ptrdiff_t型に対応する符号無し整数型へのポインタ型
(C23) wN d、i、n Nビット長の符号付き整数型へのポインタ型
b、B、o、u、x、X Nビット長の符号無し整数型へのポインタ型
(C23) wfN d、i、n Nビット長の最速の符号付き整数型へのポインタ型
b、B、o、u、x、X Nビット長の最速の符号無し整数型へのポインタ型
L a、A、e、E、f、F、g、G long double型へのポインタ型
(C23) H a、A、e、E、f、F、g、G _Decimal32型へのポインタ型
(C23) D a、A、e、E、f、F、g、G _Decimal64型へのポインタ型
(C23) DD a、A、e、E、f、F、g、G _Decimal128型へのポインタ型

wN の N は、先頭に 0 が付かない 10進整数を意味する(たとえば w32 のように指定)。<stdint.h> で定義されている最小幅の整数型(int_leastN_t や uint_leastN_t)、あるいは正確な幅の整数型(intN_t、uintN_t)のビット長と一致するものが選択される。該当するものがない場合の結果は処理系定義。

wfN の N は、先頭に 0 が付かない 10進整数を意味する(たとえば wf32 のように指定)。<stdint.h> で定義されている最速の整数型(int_fastN_t や uint_fastN_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 が溢れることはない
}

実行結果:

関連

任意のストリームに対して同様の変換指定を行い出力するには、fscanf関数を使う。対象が文字列の場合は sscanf関数が使える。


引数に … ではなく、va_list を用いたバージョンとして、vscanf関数がある。


ワイド文字版の wscanf関数がある。
解説章 第7章


参考リンク 🔗

本ページはアフィリエイトプログラムによる収益を得ています。
以下のリンクから商品を購入されると、Programming Place 管理者に紹介料が支払われています。


更新履歴 🔗

≪さらに古い更新履歴≫



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

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

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

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る