vscanf, vfscanf, vsscanf, vscanf_s, vfscanf_s, vsscanf_s
| ヘッダ <stdio.h>
|
||
int vscanf( const char* restrict format, va_list vlist );
|
で定義 (1) | (C99 以降) |
int vfscanf( FILE* restrict stream, const char* restrict format,
va_list vlist );
|
(2) | (C99 以降) |
int vsscanf( const char* restrict buffer, const char* restrict format,
va_list vlist );
|
(3) | (C99 以降) |
int vscanf_s(const char* restrict format, va_list vlist);
|
(4) | (C11 以降) |
int vfscanf_s( FILE* restrict stream, const char* restrict format,
va_list vlist);
|
(5) | (C11 以降) |
int vsscanf_s( const char* restrict buffer, const char* restrict format,
va_list vlist);
|
(6) | (C11 以降) |
さまざまなソースからデータを読み取り、formatに従って解釈し、結果をvlistで指定された場所に格納します。
streambuffer からデータを読み取ります。文字列の終わりに達することは、fscanf%c、%s、%[ 変換指定子はそれぞれ 2 つの引数(通常のポインタと、受け取り配列のサイズを示す rsize_t 型の値。%c で単一の char に読み込む場合は 1 になり得る)を期待する点、および以下のエラーが実行時に検出され、現在インストールされている 制約ハンドラ 関数を呼び出す点が異なります。
- ポインタ型の引数のいずれかがヌルポインタである。
format、stream、またはbufferがヌルポインタである。- %c、%s、または %[ によって書き込まれる文字数に終端ヌル文字を加えたものが、それらの変換指定子それぞれに指定された 2 番目 (rsize_t) の引数を超える。
- オプションで、その他検出可能なエラー(未知の変換指定子など)。
vscanf_s、vfscanf_s、vsscanf_s は、実装によって __STDC_LIB_EXT1__ が定義され、ユーザーが __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義してから <stdio.h> をインクルードした場合にのみ、使用が保証されます。引数
| stream | - | 読み取り元の入力ファイルストリーム |
| buffer | - | 読み取り元のヌル終端文字列へのポインタ |
| format | - | 入力の読み取り方法を指定するヌル終端文字列へのポインタ |
| vlist | - | 受け取り引数を含む可変引数リスト。 |
format 文字列は以下で構成されます。
- 空白以外のマルチバイト文字(
%を除く):書式文字列内のそのような各文字は、入力ストリームからまったく同じ 1 文字を消費するか、ストリーム上の次の文字が等しくない場合に関数を失敗させます。 - 空白文字:書式文字列内の単一の空白文字は、入力から利用可能な連続した空白文字をすべて消費します(isspace をループで呼び出すのと同様に判定されます)。書式文字列内の
"\n"、" "、"\t\t"、その他の空白文字に違いはないことに注意してください。 - 変換指定子。各変換指定子は以下の形式を持ちます。
- 導入の
%文字
- 導入の
- (オプション) 代入抑止文字
*。このオプションが存在する場合、関数は変換結果をいかなる受け取り引数にも代入しません。
- (オプション) 代入抑止文字
- (オプション) 最大フィールド幅 を指定する整数(0 より大きい値)。つまり、現在の変換指定子で指定された変換を行う際に関数が消費してもよい最大文字数です。
%sと%[は、幅が指定されていない場合にバッファオーバーフローを引き起こす可能性があることに注意してください。
- (オプション) 最大フィールド幅 を指定する整数(0 より大きい値)。つまり、現在の変換指定子で指定された変換を行う際に関数が消費してもよい最大文字数です。
- (オプション) 長さ修飾子。受け取り引数のサイズ、つまり実際の宛先の型を指定します。これは変換精度とオーバーフロールールに影響します。デフォルトの宛先型は変換の種類ごとに異なります(以下の表を参照)。
- 変換書式指定子。
以下の書式指定子が利用可能です。
| 変換 指定子 |
説明 | 期待される 引数の型 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 長さ修飾子→ | 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
|
文字 または 文字 のシーケンスに一致します。
|
N/A | N/A | char* |
wchar_t* |
N/A | N/A | N/A | N/A | N/A |
s
|
空白以外の文字のシーケンス(文字列)に一致します。
| |||||||||
[set ]
|
set の文字集合からの空でない文字シーケンスに一致します。
| |||||||||
d
|
10 進整数 に一致します。
|
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 進整数 に一致します。
| |||||||||
i
|
整数 に一致します。
| |||||||||
u
|
符号なし 10 進整数 に一致します。
| |||||||||
o
|
符号なし 8 進整数 に一致します。
| |||||||||
xX
|
符号なし 16 進整数 に一致します。
| |||||||||
n
|
それまでに読み取られた文字数 を返します。
| |||||||||
a (C99)A (C99)eEfF (C99)gG
|
浮動小数点数 に一致します。
|
N/A | N/A | float* |
double* |
N/A | N/A | N/A | N/A | long double* |
p
|
実装定義の文字シーケンスに一致し、ポインタ を定義します。
|
N/A | N/A | void** |
N/A | N/A | N/A | N/A | N/A | N/A |
| ノート | ||||||||||
|
変換指定子 変換指定子 固定幅整数型(int8_t など)の正しい変換指定は、ヘッダ <inttypes.h> で定義されています(ただし SCNdMAX、SCNuMAX などは 各変換指定子の動作の後にシーケンスポイントがあります。これにより、複数のフィールドを同じ「シンク」変数に格納できます。 指数部に数字がない不完全な浮動小数点値(例えば、変換指定子 変換指定が無効な場合、動作は未定義です。 | ||||||||||
戻り値
ノート
これらの関数はすべて、少なくとも 1 回 va_arg を呼び出します。戻り後の arg の値は不定です。これらの関数は va_end を呼び出さないため、呼び出し側で行う必要があります。
例
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
bool checked_sscanf(int count, const char* buf, const char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
int rc = vsscanf(buf, fmt, ap);
va_end(ap);
return rc == count;
}
int main(void)
{
int n, m;
printf("Parsing '1 2'...");
if (checked_sscanf(2, "1 2", "%d %d", &n, &m))
puts("success");
else
puts("failure");
printf("Parsing '1 a'...");
if (checked_sscanf(2, "1 a", "%d %d", &n, &m))
puts("success");
else
puts("failure");
}
出力:
Parsing '1 2'...success
Parsing '1 a'...failure
参考文献
- C23 規格 (ISO/IEC 9899:2024):
- 7.21.6.9 vfscanf 関数 (p: TBD)
- 7.21.6.11 vscanf 関数 (p: TBD)
- 7.21.6.14 vsscanf 関数 (p: TBD)
- K.3.5.3.9 vfscanf_s 関数 (p: TBD)
- K.3.5.3.11 vscanf_s 関数 (p: TBD)
- K.3.5.3.14 vsscanf_s 関数 (p: TBD)
- C17 規格 (ISO/IEC 9899:2018):
- 7.21.6.9 vfscanf 関数 (p: TBD)
- 7.21.6.11 vscanf 関数 (p: TBD)
- 7.21.6.14 vsscanf 関数 (p: TBD)
- K.3.5.3.9 vfscanf_s 関数 (p: TBD)
- K.3.5.3.11 vscanf_s 関数 (p: TBD)
- K.3.5.3.14 vsscanf_s 関数 (p: TBD)
- C11 規格 (ISO/IEC 9899:2011):
- 7.21.6.9 vfscanf 関数 (p: 327)
- 7.21.6.11 vscanf 関数 (p: 328)
- 7.21.6.14 vsscanf 関数 (p: 330)
- K.3.5.3.9 vfscanf_s 関数 (p: 597-598)
- K.3.5.3.11 vscanf_s 関数 (p: 599)
- K.3.5.3.14 vsscanf_s 関数 (p: 602)
- C99 規格 (ISO/IEC 9899:1999):
- 7.19.6.9 vfscanf 関数 (p: 293)
- 7.19.6.11 vscanf 関数 (p: 294)
- 7.19.6.14 vsscanf 関数 (p: 295)
関連項目
(C11)(C11)(C11) |
stdin、ファイルストリーム、またはバッファからの書式付き入力を読み取ります (関数) |
(C99)(C11)(C11)(C11)(C11) |
stdout、ファイルストリーム、またはバッファに書式付き出力を出力します 可変引数リストを使用 (関数) |
C++ ドキュメント for vscanf, vfscanf, vsscanf
| |