Namespaces
Variants

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

From ja.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"、その他の空白文字の間に違いはないことに注意。
  • 変換指定。各変換指定は以下の形式を持つ:
  • 導入の % 文字。
  • (省略可能) 代入抑止文字 *。このオプションが存在する場合、関数は変換結果をいかなる受け取り引数にも代入しない。
  • (省略可能) 最大フィールド幅を指定する整数値(0より大きい)。つまり、現在の変換指定で指定された変換を行う際に関数が消費を許される最大文字数である。幅が指定されていない場合、%s および %[ はバッファオーバーフローを引き起こす可能性があることに注意。
  • (省略可能) 長さ修飾子。受け取り引数のサイズ、すなわち実際の宛先の型を指定する。これは変換精度とオーバーフローのルールに影響する。デフォルトの宛先型は変換の種類ごとに異なる(以下の表を参照)。
  • 変換フォーマット指定子。

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

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

文字または文字のシーケンスと一致する。

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

非空白文字のシーケンス(文字列)と一致する。

  • 幅指定子が使用された場合、最大 幅 文字、または最初の空白文字までのうち、最初に現れる方まで一致する。
  • 一致した文字に加えて常にヌル文字を格納する(そのため引数配列は少なくとも 幅+1 文字分の領域を確保しなければならない)。
[集合 ]

文字の集合からの非空のシーケンスと一致する。

  • 集合の最初の文字が ^ の場合、集合に含まれないすべての文字が一致する。
  • 集合が ] または ^] で始まる場合、] 文字も集合に含まれる。
  • スキャンセット内の非先頭位置にある文字 - が、[0-9] のように範囲を示す可能性があるかどうかは実装定義である。
  • 幅指定子が使用された場合、最大 幅 までしか一致しない。
  • 一致した文字に加えて常にヌル文字を格納する(そのため引数配列は少なくとも 幅+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*
std::intmax_t* または std::uintmax_t*
std::size_t*
std::ptrdiff_t*
N/A
b (C++26)

符号なし 2進整数と一致する。

  • 数値の形式は、std::strtoul が 2 の値を base 引数として期待するものと同じである。
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 が期待するものと同じである。
N/A N/A
float*
double*
N/A N/A N/A N/A
long double*
p

ポインタを定義する実装定義の文字シーケンスと一致する。

  • printf 系の関数は、%p フォーマット指定子を使用して同じシーケンスを生成するべきである。
N/A N/A
void**
N/A N/A N/A N/A N/A N/A
注釈

n 以外のすべての変換指定子について、指定されたフィールド幅を超えず、かつ変換指定子が期待するものと正確に一致するか、またはそれが期待するシーケンスの接頭辞であるような、最長の入力文字シーケンスがストリームから消費される。この消費されたシーケンスの後の最初の文字(存在する場合)は読み取られずに残る。消費されたシーケンスの長さがゼロであるか、または消費されたシーケンスが上記のように変換できない場合、ファイル終端、エンコーディングエラー、または読み取りエラーがストリームからの入力を妨げない限り、マッチング失敗が発生する。妨げた場合は入力失敗となる。

% 指定子を除き、入力項目(または %n の場合は入力文字数)は、最初に変換指定子に適切な型に変換される。* で代入が抑制されていない限り、変換結果はまだ書き込まれていない次の引数が指すオブジェクトに書き込まれる。このオブジェクトが適切な型を持たない場合、または変換結果がオブジェクトで表現できない場合、動作は未定義である。

[、c、および n 以外のすべての変換指定子は、入力の解析を試みる前に、先頭のすべての空白文字(あたかも std::isspace を呼び出すかのように判定される)を消費して破棄する。これらの消費された文字は、指定された最大フィールド幅にはカウントされない。

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

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

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

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

指数部に数字がない不完全な浮動小数点値(例えば変換指定子 "100er" で %f を解析する場合)を解析するとき、シーケンス "100e"(おそらく有効な浮動小数点数の最長接頭辞)が消費され、マッチングエラー(消費されたシーケンスを浮動小数点数に変換できない)が発生し、"r" が残る。既存の実装の中にはこのルールに従わず、"100" のみを消費するようにロールバックし、"er" を残すものがある(例:glibc バグ 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