Namespaces
Variants

std:: vscanf, std:: vfscanf, std:: vsscanf

From cppreference.net
< cpp ‎ | io ‎ | c
ヘッダーで定義 <cstdio>
int vscanf ( const char * format, std :: va_list vlist ) ;
(1) (C++11以降)
int vfscanf ( std:: FILE * stream, const char * format, std :: va_list vlist ) ;
(2) (C++11以降)
int vsscanf ( const char * buffer, const char * format, std :: va_list vlist ) ;
(3) (C++11以降)

様々なソースからデータを読み取り、 format に従って解釈し、結果を vlist で定義された場所に格納します。

1) stdin からデータを読み取ります。
2) ファイルストリーム stream からデータを読み取ります。
3) ヌル終端文字列 buffer からデータを読み取ります。

目次

パラメータ

stream - 読み取り元の入力ファイルストリーム
buffer - 読み取り元のヌル終端文字列へのポインタ
format - 入力の読み取り方法を指定するヌル終端文字列へのポインタ
vlist - 受信引数を含む可変引数リスト


format 文字列は以下で構成されます

  • 空白文字以外のマルチバイト文字( % を除く): 書式文字列内の各文字は入力ストリームから正確に同一の文字1文字を消費する。ストリーム上の次の文字が等しくない場合、関数は失敗する。
  • 空白文字: 書式文字列内の単一の空白文字は、入力から利用可能な連続する全ての空白文字を消費する(ループで std::isspace を呼び出した場合と同様に判定される)。 " \n " " " " \t \t " など、書式文字列内の空白文字に違いはないことに注意。
  • 変換指定子。各変換指定子は以下の形式をとる:
  • 導入 % 文字。
  • (オプション) 代入抑制文字 * 。このオプションが存在する場合、関数は変換結果を受信引数に代入しません。
  • (オプション) ゼロより大きい整数値で、 最大フィールド幅 を指定します。これは現在の変換指定子によって指定された変換を行う際に関数が消費できる最大文字数を示します。 % s および % [ は、幅が指定されていない場合バッファオーバーフローを引き起こす可能性があることに注意してください。
  • (オプション) 長さ修飾子 は、受信引数のサイズ、つまり実際の変換先の型を指定します。これは変換精度とオーバーフロー規則に影響します。デフォルトの変換先型は変換タイプごとに異なります(下記の表を参照)。
  • 変換フォーマット指定子。

以下のフォーマット指定子が利用可能です:

変換指定子
説明 期待される
引数の型
長さ修飾子→ hh h なし l ll j z t L
C++11以降でのみ利用可能→ はい はい はい はい はい
%
リテラルの % に一致します。
N/A N/A N/A N/A N/A N/A N/A N/A N/A
c

1文字または文字のシーケンスにマッチします。

  • 幅指定子が使用される場合、正確に width 文字にマッチします(引数は十分な領域を持つ配列へのポインタでなければなりません)。
  • %sや%[とは異なり、配列にnull文字を追加しません。
N/A N/A
char *
wchar_t *
N/A N/A N/A N/A N/A
s

空白以外の文字の連続( 文字列 )にマッチします。

  • 幅指定子が使用されている場合、 width まで、または最初の空白文字のいずれか先に現れた方までマッチします。
  • マッチした文字に加えて常にnull文字を格納します(したがって、引数の配列には少なくとも width+1 文字分の領域が必要です)。
[ set  ]

set 内の文字からなる空でない文字シーケンスにマッチします。

  • セットの最初の文字が ^ の場合、セットに含まれないすべての文字がマッチします。
  • セットが ] または ^] で始まる場合、 ] 文字もセットに含まれます。
  • スキャンセット内の先頭以外の位置にある - 文字が [0-9] のように範囲を示すかどうかは実装定義です。
  • 幅指定子が使用されている場合、最大 width 文字までマッチします。
  • 常にマッチした文字に加えてnull文字を格納します(したがって、引数配列には少なくとも width+1 文字分の領域が必要です)。
d

10進整数 にマッチします。

  • 数値の形式は、 std::strtol 10 base 引数として期待するものと同じです。
signed char * または unsigned char *
signed short * または unsigned short *
signed int * または unsigned int *
signed long * または unsigned long *
signed long long * または unsigned long long *
該当なし
i

整数 にマッチします。

  • 数値のフォーマットは、 std::strtol 0 base 引数として期待するものと同じです(基数は解析された最初の文字によって決定されます)。
u

符号なし 10進整数 にマッチします。

  • 数値のフォーマットは、 std::strtoul 10 base 引数として期待するものと同じです。
o

符号なし 8進整数 にマッチします。

  • 数値の形式は、 std::strtoul 8 base 引数として期待するものと同じです。
x
X

符号なし 16進整数 にマッチします。

  • 数値の形式は、 std::strtoul 16 base 引数として期待する形式と同じです。
n

これまでに読み取られた 文字数を返します

  • 入力は消費されません。代入カウントは増加しません。
  • 指定子に代入抑制演算子が定義されている場合、動作は未定義です。
a (C++11)
A (C++11)
e
E
f
F (C++11)
g
G

浮動小数点数 にマッチします。

  • 数値のフォーマットは std::strtof が期待するものと同じです。
該当なし 該当なし
float *
double *
該当なし 該当なし 該当なし 該当なし
long double *
p

実装定義の文字シーケンスにマッチし、 ポインタ を定義します。

  • printf 関数群は %p フォーマット指定子を使用して同じシーケンスを生成する必要があります。
N/A N/A
void **
N/A N/A N/A N/A N/A N/A
注記

n 以外のすべての変換指定子について、指定されたフィールド幅を超えず、かつ変換指定子が期待する文字シーケンスと完全に一致するか、そのプレフィックスであるような入力文字の最長シーケンスがストリームから消費されます。この消費されたシーケンスの後の最初の文字(存在する場合)は読み取り済みとなりません。消費されたシーケンスの長さがゼロである場合、または消費されたシーケンスが上記のように変換できない場合、マッチング失敗が発生します。ただし、ストリームからの入力がEOF、エンコーディングエラー、または読み取りエラーによって妨げられた場合は入力失敗となります。

[ c n 以外のすべての変換指定子は、入力の解析を試みる前にすべての先行する空白文字( std::isspace を呼び出した場合と同様に判定)を消費して破棄します。これらの消費された文字は、指定された最大フィールド幅にはカウントされません。

変換指定子 lc ls l [ は、最初の文字が変換される前にゼロに初期化された std::mbstate_t オブジェクトを使用して std::mbrtowc を呼び出したかのように、マルチバイトからワイド文字への変換を実行します。

変換指定子 s [ は、一致した文字に加えて常にナルターミネータを格納します。変換先配列のサイズは、指定されたフィールド幅より少なくとも1大きくなければなりません。変換先配列のサイズを指定せずに % s または % [ を使用することは、 std::gets と同様に安全ではありません。

固定幅整数型 std::int8_t など)に対する正しい変換指定はヘッダ <cinttypes> で定義されています(ただし SCNdMAX SCNuMAX などは % jd % ju などと同義です)。

各変換指定子の動作の後に シーケンスポイント が存在します。これにより、複数のフィールドを同じ「シンク」変数に格納することが可能になります。

指数部で終わり数字がない不完全な浮動小数点値(例えば "100er" を変換指定子 % f で解析する場合)を解析するとき、 "100e" (有効な浮動小数点数の可能性のある最長プレフィックス)が消費され、マッチングエラー(消費されたシーケンスを浮動小数点数に変換できない)が発生し、 "r" が残ります。既存の実装の中にはこの規則に従わず、 "100" のみを消費するようにロールバックし、 "er" を残すものもあります(例: glibc bug 1765 )。

変換指定が無効な場合、動作は未定義です。

戻り値

正常に読み取られた引数の数、または EOF エラーが発生した場合。

注記

これらの関数はすべて少なくとも1回 va_arg を呼び出し、戻り値の後では arg の値は不定となる。これらの関数は va_end を呼び出さないため、呼び出し元が実行する必要がある。

#include <cstdarg>
#include <cstdio>
#include <iostream>
#include <stdexcept>
void checked_sscanf(int count, const char* buf, const char *fmt, ...)
{
    std::va_list ap;
    va_start(ap, fmt);
    if (std::vsscanf(buf, fmt, ap) != count)
        throw std::runtime_error("parsing error");
    va_end(ap);
}
int main()
{
    try
    {
        int n, m;
        std::cout << "Parsing '1 2'... ";
        checked_sscanf(2, "1 2", "%d %d", &n, &m);
        std::cout << "success\n";
        std::cout << "Parsing '1 a'... ";
        checked_sscanf(2, "1 a", "%d %d", &n, &m);
        std::cout << "success\n";
    }
    catch (const std::exception& e)
    {
        std::cout << e.what() << '\n';
    }
}

出力:

Parsing '1 2'... success
Parsing '1 a'... parsing error

関連項目

フォーマットされた入力を stdin 、ファイルストリーム、またはバッファから読み込む
(関数)
可変引数リストを使用してフォーマットされた出力を stdout 、ファイルストリーム、またはバッファに出力する
可変引数リストを使用
(関数)
Cドキュメント for vscanf , vfscanf , vsscanf