Namespaces
Variants

std:: wscanf, std:: fwscanf, std:: swscanf

From ja.cppreference.net
< cpp ‎ | io ‎ | c
ヘッダーで定義 <cwchar>
int wscanf ( const wchar_t * format, ... ) ;
(1)
int fwscanf ( std:: FILE * stream, const wchar_t * format, ... ) ;
(2)
int swscanf ( const wchar_t * buffer, const wchar_t * format, ... ) ;
(3)

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

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

目次

パラメータ

ストリーム - 読み取り元の入力ファイルストリーム
バッファ - 読み取り元のヌル終端ワイド文字列へのポインタ
フォーマット - 入力の読み取り方法を指定するヌル終端ワイド文字列へのポインタ
... - 受け取り引数。


フォーマット文字列は以下から構成されます:

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

変換

指定子
説明
期待される 引数型
長さ修飾子→
なし hh h C++11以降のみ利用可能→ l ll j z t L
はい はい はい はい はい リテラル
%
にマッチします。%N/A
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文字分の領域が必要です)。
[集合 ]

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

  • 集合の最初の文字が^の場合、集合に含まれないすべての文字にマッチします。
  • 集合が]または^]で始まる場合、]文字も集合に含まれます。
  • スキャンセット内の非先頭位置にある文字-が[0-9]のような範囲を示すかどうかは処理系定義です。
  • 幅指定子が使用された場合、最大幅までのみマッチします。
  • マッチした文字に加えて常にヌル文字を格納します(そのため引数配列には少なくともwidth+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以外のすべての変換指定子について、指定されたフィールド幅を超えず、かつ変換指定子が期待するものと正確に一致するか、それが期待するシーケンスの接頭辞であるような、最も長い入力文字シーケンスがストリームから消費されます。この消費されたシーケンスの後の最初の文字(存在する場合)は未読のまま残ります。消費されたシーケンスの長さがゼロであるか、消費されたシーケンスを上記のように変換できない場合、マッチング失敗が発生します。ただし、ファイル終端、エンコーディングエラー、または読み取りエラーによってストリームからの入力が妨げられた場合は入力失敗となります。

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

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

長さ指定子lが使用されない場合、変換指定子c、s、および[は、最初の文字が変換される前にゼロに初期化されたstd::wcrtombオブジェクトを使用して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 。

例

関連項目

(C++11) (C++11) (C++11)
可変長引数リストを使用して stdin 、ファイルストリーム
またはバッファからフォーマットされたワイド文字入力を読み取る
(関数)
Cドキュメント を参照 wscanf , fwscanf , swscanf