名前空間
変種
操作

wscanf, fwscanf, swscanf, wscanf_s, fwscanf_s, swscanf_s

From cppreference.com
< c‎ | io
 
 
ファイル入出力
型とオブジェクト
        
関数
ファイルアクセス
(C95)
非書式化入出力
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

書式付き入力
wscanffwscanfswscanfwscanf_sfwscanf_sswscanf_s
(C95)(C95)(C95)(C11)(C11)(C11)
直接入出力
書式付き出力
ファイルポジショニング
エラーハンドリング
ファイル操作
 
ヘッダー <wchar.h> で定義
(1)
int wscanf( const wchar_t *format, ... );
(C95 以降)
(C99まで)
int wscanf( const wchar_t *restrict format, ... );
(C99以降)
(2)
int fwscanf( FILE *stream, const wchar_t *format, ... );
(C95 以降)
(C99まで)
int fwscanf( FILE *restrict stream,
             const wchar_t *restrict format, ... );
(C99以降)
(3)
int swscanf( const wchar_t *buffer, const wchar_t *format, ... );
(C95 以降)
(C99まで)
int swscanf( const wchar_t *restrict buffer,
             const wchar_t *restrict format, ... );
(C99以降)
int wscanf_s( const wchar_t *restrict format, ...);
(4) (C11 以降)
int fwscanf_s( FILE *restrict stream,
               const wchar_t *restrict format, ...);
(5) (C11 以降)
int swscanf_s( const wchar_t *restrict s,
               const wchar_t *restrict format, ...);
(6) (C11 以降)

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

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

目次

[編集] Parameters

stream - 読み込む入力ファイルストリーム
buffer - 読み込む null終端ワイド文字列へのポインタ
format - 入力をどのように読み取るかを指定する null終端ワイド文字列へのポインタ
... - 受信引数。


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

文字 または 文字のシーケンス にマッチします。

  • 幅指定子が使用されている場合、厳密に *width* ワイド文字と一致します(引数は十分な容量を持つ配列へのポインタである必要があります)。
  • %s および %[ とは異なり、ヌル文字を配列に追加しません。
N/A N/A
char*
wchar_t*
N/A N/A N/A N/A N/A
s

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

  • 幅指定子が使用されている場合、width 個まで、または最初の空白文字まで(どちらか早い方)にマッチします。
  • マッチした文字に加えて常にヌル文字を格納します(したがって、引数配列は少なくとも width+1 文字のスペースが必要です)。
[set ]

set 文字セットからの空でない文字シーケンスにマッチします。

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

10進整数 にマッチします。

  • base 引数に 10 を指定して、wcstol が期待する形式の数。
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*
N/A
i

整数 にマッチします。

  • base 引数に 0 を指定して、wcstol が期待する形式の数(先頭の文字を解析した結果、基数が決定される)。
u

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

  • base 引数に 10 を指定して、wcstoul が期待する形式の数。
o

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

  • base 引数に 8 を指定して、wcstoul が期待する形式の数。
x
X

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

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

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

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

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

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

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

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

変換指定子が不正な場合、動作は未定義です。

[編集] Return value

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

[編集] Example

#include <stdio.h>
#include <wchar.h>
#include <string.h>
 
#define NUM_VARS   3
#define ERR_READ   2
#define ERR_WRITE  3
 
int main(void) {
    wchar_t state[64];
    wchar_t capital[64];
    unsigned int population = 0;
    int elevation = 0;
    int age = 0;
    float pi = 0;
 
#if INTERACTIVE_MODE
    wprintf(L"Enter state, age, and pi value: ");
    if (wscanf(L"%ls%d%f", state, &age, &pi) != NUM_VARS) {
        fprintf(stderr, "Error reading input.\n");
        return ERR_READ;
    }
#else
    wchar_t* input = L"California 170 3.141592";
    if (swscanf(input, L"%ls%d%f", state, &age, &pi) != NUM_VARS) {
        fprintf(stderr, "Error reading input.\n");
        return ERR_READ;
    }
#endif
    wprintf(L"State: %ls\nAge  : %d years\nPi   : %.5f\n\n", state, age, pi);
 
    FILE* fp = tmpfile();
    if (fp) {
        // write some data to temp file
        if (!fwprintf(fp, L"Mississippi Jackson 420000 807")) {
            fprintf(stderr, "Error writing to file.\n");
            fclose(fp);
            return ERR_WRITE;
        }
        // rewind file pointer
        rewind(fp);
 
        // read data into variables
        fwscanf(fp, L"%ls%ls%u%d", state, capital, &population, &elevation);
        wprintf(L"State  : %ls\nCapital: %ls\nJackson population (in 2020): %u\n"
                L"Highest elevation: %dft\n",
                state, capital, population, elevation);
        fclose(fp);
    }
}

実行結果の例

State: California
Age  : 170 years
Pi   : 3.14159
 
State  : Mississippi
Capital: Jackson
Jackson population (in 2020): 420000
Highest elevation: 807ft

[編集] References

  • C11標準 (ISO/IEC 9899:2011)
  • 7.29.2.2 The fwscanf function (p: 410-416)
  • 7.29.2.4 The swscanf function (p: 417)
  • 7.29.2.12 The wscanf function (p: 421)
  • K.3.9.1.2 The fwscanf_s function (p: 628-629)
  • K.3.9.1.5 The swscanf_s function (p: 631)
  • K.3.9.1.14 The wscanf_s function (p: 638)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.24.2.2 The fwscanf function (p: 356-362)
  • 7.24.2.4 The swscanf function (p: 362)
  • 7.24.2.12 The wscanf function (p: 366-367)

[編集] See also

stdin、ファイルストリームからフォーマットされたワイド文字入力を読み込みます
または可変長引数リストを使用してバッファから
(function) [編集]
C++ ドキュメント (wscanf, fwscanf, swscanf)
English 日本語 中文(简体) 中文(繁體)