Namespaces
Variants

std:: vwscanf, std:: vfwscanf, std:: vswscanf

From ja.cppreference.net
< cpp ‎ | io ‎ | c
定義先ヘッダ <cwchar>
int vwscanf ( const wchar_t * format, std :: va_list vlist ) ;
(1) (C++11以降)
int vfwscanf ( std:: FILE * stream, const wchar_t * format, std :: va_list vlist ) ;
(2) (C++11以降)
int vswscanf ( const wchar_t * buffer, const wchar_t * format, std :: va_list vlist ) ;
(3) (C++11以降)

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

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

目次

パラメータ

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


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

  • %以外の非空白ワイド文字: 書式文字列内のそのような各文字は、入力ストリームから1つの同一文字を正確に消費するか、ストリーム上の次の文字が等しくない場合に関数を失敗させます。
  • 空白文字: 書式文字列内の任意の単一空白文字は、入力から利用可能な連続するすべての空白文字を消費します(std::iswspaceをループ内で呼び出すかのように判定)。なお、書式文字列内の"\n"、" "、"\t\t"、その他の空白文字に違いはありません。
  • 変換指定。各変換指定は以下の書式を持ちます:
  • 導入の % 文字。
  • (オプション) 代入抑止文字 *。このオプションが存在する場合、関数は変換結果をいかなる受け取り引数にも代入しません。
  • (オプション) 最大フィールド幅を指定する0より大きい整数。つまり、現在の変換指定で指定された変換を行う際に関数が消費を許可される最大文字数です。幅が指定されていない場合、%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つの文字または一連の文字にマッチ。

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

非空白文字のシーケンス(文字列)にマッチ。

  • 幅指定子が使用された場合、最大 幅文字まで、または最初の空白文字まで、のうち先に発生した方にマッチ。
  • マッチした文字に加えて常にナル文字を格納します(そのため引数配列は少なくとも 幅+1文字分の領域を確保する必要があります)。
[set ]

文字の集合からの非空のシーケンスにマッチ。

  • 集合の最初の文字が ^ の場合、集合に含まれないすべての文字がマッチされます。
  • 集合が ] または ^] で始まる場合、 ] 文字も集合に含まれます。
  • スキャン集合内の初期位置以外での - 文字が [0-9] のように範囲を示すかどうかは処理系定義です。
  • 幅指定子が使用された場合、最大 幅までのみマッチ。
  • マッチした文字に加えて常にナル文字を格納します(そのため引数配列は少なくとも 幅+1文字分の領域を確保する必要があります)。
d

10進整数にマッチ。

  • 数値の書式は、std::wcstol で 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::wcstoul で 2 引数に値 base を使用した場合と同じです。
i

整数にマッチ。

  • 数値の書式は、std::wcstol で 0 引数に値 base を使用した場合と同じです(基数は最初に解析された文字によって決定されます)。
u

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

  • 数値の書式は、std::wcstoul で 10 引数に値 base を使用した場合と同じです。
o

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

  • 数値の書式は、std::wcstoul で 8 引数に値 base を使用した場合と同じです。
x
X

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

  • 数値の書式は、std::wcstoul で 16 引数に値 base を使用した場合と同じです。
n

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

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

浮動小数点数にマッチ。

  • 数値の書式は、std::wcstof と同じです。
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以外のすべての変換指定子について、指定されたフィールド幅を超えず、かつ変換指定子が期待するものと正確に一致するか、またはそれが期待するシーケンスの接頭辞であるような、入力文字の最長シーケンスがストリームから消費されます。この消費されたシーケンスの後の最初の文字(存在する場合)は未読のまま残ります。消費されたシーケンスの長さが0であるか、または消費されたシーケンスを上記のように変換できない場合、ファイル終端、エンコードエラー、または読み取りエラーによってストリームからの入力が妨げられない限り、マッチング失敗が発生します(その場合は入力失敗です)。

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

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

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

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

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

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

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

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

戻り値

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

例

関連項目

標準入力、ファイルストリーム、またはバッファから 書式化されたワイド文字入力を読み込む
(関数)
Cドキュメント for vwscanf , vfwscanf , vswscanf