vscanf, vfscanf, vsscanf, vscanf_s, vfscanf_s, vsscanf_s
ヘッダ <stdio.h> で定義 | ||
int vscanf(constchar*restrict format, va_list vlist ); | (1) | (C99以上) |
int vfscanf(FILE*restrict stream, constchar*restrict format, va_list vlist ); | (2) | (C99以上) |
int vsscanf(constchar*restrict buffer, constchar*restrict format, va_list vlist ); | (3) | (C99以上) |
int vscanf_s(constchar*restrict format, va_list vlist); | (4) | (C11以上) |
int vfscanf_s(FILE*restrict stream, constchar*restrict format, va_list vlist); | (5) | (C11以上) |
int vsscanf_s(constchar*restrict buffer, constchar*restrict format, va_list vlist); | (6) | (C11以上) |
様々なソースからデータを読み込み、それを format
に従って解釈し、結果を vlist
によって定義される位置に格納します。
stream
からデータを読み込みます。buffer
からデータを読み込みます。 文字列の終端への到達は fscanf
に対するファイル終端への到達と同等です。- ポインタ型の引数のいずれかがヌルポインタ。
format
、stream
またはbuffer
がヌルポインタ。- %c、 %s または %[ によって書き込まれるであろう文字数プラス終端のヌル文字が、それらの変換指定子に対して提供された2番目の (rsize_t 型の) 引数を超える。
- オプションで、不明な変換指定子などのその他の検出可能なあらゆるエラー。
- すべての境界チェック付き関数と同様に、
vscanf_s
、vfscanf_s
、 およびvsscanf_s
は __STDC_LIB_EXT1__ が処理系によって定義されていて、<stdio.h>
をインクルードする前にユーザが __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ、利用可能であることが保証されます。
目次 |
[編集]引数
stream | - | 読み込む入力ファイルストリーム | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
buffer | - | 読み込むヌル終端文字列を指すポインタ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
format | - | 入力の読み込み方法を指定するヌル終端文字列を指すポインタ。 書式文字列は以下から構成されます。
以下の書式指定子が利用できます。
長さ指定子 変換指定子 固定幅の整数型に対する正しい変換指定は、ヘッダ <inttypes.h> で定義されています (SCNdMAX, SCNuMAX などは 変換指定子それぞれの動作後に副作用完了点があります。 これにより同じ「ゴミ箱」変数に複数のフィールドを格納することができます。 数字のない指数で終わる不完全な浮動小数点値をパースするとき、例えば変換指定子 %f で "100er" をパースするとき、シーケンス "100e" (有効な浮動小数点数の可能性がある最も長い接頭辞) が消費され、結果はマッチエラーとなり (消費したシーケンスは浮動小数点数に変換できません)、 "r" が残されます。 処理系によってはこのルールに従わず、ロールバックして "100" のみを消費し、 "er" を残します (glibc bug 1765)。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vlist | - | 受け取り引数を格納している可変長引数リスト |
[編集]戻り値
[編集]ノート
これらのすべての関数は va_arg を少なくとも1回は呼び、戻った後の arg
の値は不定になります。 これらの関数は va_end を呼ばす、それは呼び出し元が行わなければなりません。
[編集]例
#include <stdio.h>#include <stdbool.h>#include <stdarg.h> bool checked_sscanf(int count, constchar* buf, constchar*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");elseputs("failure"); printf("Parsing '1 a'...");if(checked_sscanf(2, "1 a", "%d %d", &n, &m))puts("success");elseputs("failure");}
出力:
Parsing '1 2'...success Parsing '1 a'...failure
[編集]参考文献
- C11 standard (ISO/IEC 9899:2011):
- 7.21.6.9 The vfscanf function (p: 327)
- 7.21.6.11 The vscanf function (p: 328)
- 7.21.6.14 The vsscanf function (p: 330)
- K.3.5.3.9 The vfscanf_s function (p: 597-598)
- K.3.5.3.11 The vscanf_s function (p: 599)
- K.3.5.3.14 The vsscanf_s function (p: 602)
- C99 standard (ISO/IEC 9899:1999):
- 7.19.6.9 The vfscanf function (p: 293)
- 7.19.6.11 The vscanf function (p: 294)
- 7.19.6.14 The vsscanf function (p: 295)
[編集]関連項目
(C11)(C11)(C11) | stdin、ファイルストリームまたはバッファから書式付き入力を読み取ります (関数) |
(C99)(C11)(C11)(C11)(C11) | stdout、ファイルストリームまたはバッファに可変個引数リストを使用して書式付き出力を書き出します (関数) |
vscanf, vfscanf, vsscanf の C++リファレンス |