Namespaces
Variants

vwscanf, vfwscanf, vswscanf, vwscanf_s, vfwscanf_s, vswscanf_s

ja.cppreference.net より
< c | io
 
 
ファイル入出力
型とオブジェクト
        
関数
ファイルアクセス
(C95)
書式なし入出力
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

書式付き入力
 
ヘッダ <wchar.h>
int vwscanf( const wchar_t *restrict format, va_list vlist );
で定義 (1) (C99以降)
int vfwscanf( FILE *restrict stream,
              const wchar_t *restrict format, va_list vlist );
(2) (C99以降)
int vswscanf( const wchar_t *restrict buffer,
              const wchar_t *restrict format, va_list vlist );
(3) (C99以降)
int vwscanf_s( const wchar_t *restrict format, va_list vlist );
(4) (C11以降)
int vfwscanf_s( FILE *restrict stream,
                const wchar_t *restrict format, va_list vlist );
(5) (C11以降)
int vswscanf_s( const wchar_t *restrict buffer,
                const wchar_t *restrict format, va_list vlist );
(6) (C11以降)

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

1) stdin からデータを読み込みます。
2) ファイルストリーム stream からデータを読み込みます。
3) ヌル終端ワイド文字列 buffer からデータを読み込みます。文字列の終端に達することは、fwscanf
のファイル終端条件に達することと同じです。4-6) (1-3) と同じですが、%c、%s、%[ 変換指定子がそれぞれ2つの引数(通常のポインタと、受信配列のサイズを示す rsize_t 型の値。%lc で単一のワイド文字を読み取る場合は1になることがあります)を期待する点、および以下のエラーが実行時に検出され、現在インストールされている 制約ハンドラ 関数を呼び出す点が異なります。
  • ポインタ型の引数のいずれかがヌルポインタである
  • format、stream、または buffer がヌルポインタである
  • %c、%s、または %[ によって書き込まれる文字数(終端ヌル文字を含む)が、これらの変換指定子のそれぞれに指定された2番目の引数 (rsize_t) を超える場合
  • オプションで、その他の検出可能なエラー(未知の変換指定子など)
他の境界チェック関数と同様に、vwscanf_s、vfwscanf_s、および vswscanf_s は、実装が __STDC_LIB_EXT1__ を定義しており、ユーザーが __STDC_WANT_LIB_EXT1__ をインクルードする前に整数定数 1 に < を定義した場合にのみ、利用が保証されます。>。

引数

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


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

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

以下の形式指定子が利用可能です。

変換
指定子
説明 期待される
引数の型
長さ修飾子→ hh h なし l ll j z t L
C99以降のみ利用可能→ はい はい はい はい はい
%
リテラル % に一致します。
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

空白以外の文字のシーケンス(文字列)に一致します。

  • 幅指定子が使用される場合、幅 まで、または最初の空白文字まで、いずれか早い方に一致します。
  • 一致した文字に加えて常にヌル文字を格納します(そのため引数配列は少なくとも width+1 文字分の領域を確保する必要があります)。
[set ]

set の文字セットからの非空の文字シーケンスに一致します。

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

10進整数 に一致します。

  • 数値の形式は、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*
intmax_t* または uintmax_t*
size_t*
ptrdiff_t*
N/A
b (C23)

符号なし 2進整数 に一致します。

  • 数値の形式は、wcstoul が 2 を base 引数として期待するものと同じです。
i

整数 に一致します。

  • 数値の形式は、wcstol が 0 を base 引数として期待するものと同じです(基数は最初に解析された文字によって決定されます)。
u

符号なし 10進整数 に一致します。

  • 数値の形式は、wcstoul が 10 を base 引数として期待するものと同じです。
o

符号なし 8進整数 に一致します。

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

符号なし 16進整数 に一致します。

  • 数値の形式は、wcstoul が 16 を base 引数として期待するものと同じです。
n

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

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

浮動小数点数 に一致します。

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

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

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

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

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

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

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

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

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

戻り値

1-3) 正常に代入された受信引数の数、または最初の受信引数が代入される前に読み取り失敗が発生した場合は EOF。
4-6) (1-3) と同じですが、実行時制約違反があった場合も EOF を返します。

ノート

これらの関数はすべて va_arg を呼び出す可能性があり、戻り後に arg の値は不定です。これらの関数は va_end を呼び出さず、呼び出し元が行う必要があります。

例

参考文献

  • C11 標準 (ISO/IEC 9899:2011):
  • 7.29.2.6 The vfwscanf function (p: 418)
  • 7.29.2.8 The vswscanf function (p: 419)
  • 7.29.2.10 The vwscanf function (p: 420)
  • K.3.9.1.7 The vfwscanf_s function (p: 632-633)
  • K.3.9.1.10 The vswscanf_s function (p: 635-636)
  • K.3.9.1.12 The vwscanf_s function (p: 637)
  • C99 標準 (ISO/IEC 9899:1999):
  • 7.24.2.6 The vfwscanf function (p: 364)
  • 7.24.2.8 The vswscanf function (p: 365)
  • 7.24.2.10 The vwscanf function (p: 366)

関連項目

stdin、ファイルストリームまたはバッファから書式付きワイド文字入力を読み取ります
(関数)
C++ ドキュメント vwscanf、vfwscanf、vswscanf