Namespaces
Variants

wscanf, fwscanf, swscanf, wscanf_s, fwscanf_s, swscanf_s

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

書式付き入力
 
ヘッダ <wchar.h>
int wscanf( const wchar_t* format, ... );
(1) (C95以降)
(C99未満)
int wscanf( const wchar_t* restrict format, ... );
(C99以降)
int fwscanf( FILE* stream, const wchar_t* format, ... );
(2) (C95以降)
(C99未満)
int fwscanf( FILE* restrict stream,
             const wchar_t* restrict format, ... );
(C99以降)
int swscanf( const wchar_t* buffer, const wchar_t* format, ... );
(3) (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) ヌル終端ワイド文字列 buffer からデータを読み取ります。文字列の終端に達することは、fwscanf
のファイル終端条件に達することと同等です。4-6) (1-3) と同じですが、%c, %s, %[ 変換指定子はそれぞれ 2 つの引数(通常のポインタと、受信配列のサイズを示す rsize_t 型の値。単一のワイド文字に対して 1 で読み取る場合は %lc を指定可能)を期待し、さらに以下のエラーが実行時に検出され、現在インストールされている 制約ハンドラ 関数を呼び出す点が異なります。
  • ポインタ型の引数のいずれかがヌルポインタである
  • format, stream, または buffer がヌルポインタである
  • %c, %s, または %[ によって書き込まれる文字数に終端のヌル文字を加えた数が、それら各変換指定子に指定された 2 番目の (rsize_t) 引数を超える場合
  • オプションとして、未知の変換指定子など、検出可能なその他のエラー
すべての境界チェック関数と同様に、wscanf_s, fwscanf_s, および swscanf_s は、実装によって __STDC_LIB_EXT1__ が定義され、ユーザーが __STDC_WANT_LIB_EXT1__ を整数定数 1 として定義してから <wchar.h> をインクルードした場合にのみ使用可能であることが保証されます。

引数

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


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

  • 空白以外のワイド文字(% を除く):書式文字列内のそのような各文字は、入力ストリームから正確に 1 つの同一文字を消費するか、ストリーム上の次の文字が等しくない場合に関数を失敗させます。
  • 空白文字:書式文字列内の単一の空白文字は、入力から利用可能な連続するすべての空白文字を消費します(iswspace をループで呼び出すかのように判定されます)。書式文字列内の "\n", " ", "\t\t" またはその他の空白文字の間に差異はないことに注意してください。
  • 変換指定。各変換指定は以下の形式を持ちます。
  • 導入用 % 文字。
  • (省略可能) 代入抑止文字 *。このオプションが存在する場合、関数は変換結果をどの受け取り引数にも代入しません。
  • (省略可能) 最大フィールド幅 を指定する整数(ゼロより大きい)。つまり、現在の変換指定で指定された変換を実行する際に関数が消費を許可される最大文字数です。%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

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

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

set の文字の空でないシーケンスに一致します。

  • セットの最初の文字が ^ の場合、セットに含まれないすべての文字が一致します。
  • セットが ] または ^] で始まる場合、 ] 文字もセットに含まれます。
  • スキャンセット内の非初期位置にある文字 - が [0-9] のように範囲を示すことができるかどうかは実装定義です。
  • 幅指定子が使用された場合、最大 幅 までのみ一致します。
  • 一致した文字に加えて常にヌル文字を格納します(そのため、引数配列は少なくとも 幅+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 バグ 1765。

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

戻り値

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

例

#include <stdio.h>
#include <string.h>
#include <wchar.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

参考文献

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

関連項目

可変引数リストを使用して stdin, ファイルストリーム
またはバッファから書式付きワイド文字入力を読み取ります
(関数)
C++ ドキュメント wscanf, fwscanf, swscanf