wscanf, fwscanf, swscanf, wscanf_s, fwscanf_s, swscanf_s
| ヘッダ <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 に従って解釈し、結果を指定された場所に格納します。
stream からデータを読み取ります。buffer からデータを読み取ります。文字列の終端に達することは、fwscanf%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
|
文字 または 文字列 に一致します。
|
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 などは 各変換指定子のアクションの後に シーケンスポイント があります。これにより、同じ「シンク」変数に複数のフィールドを格納できます。 数字のない指数で終わる不完全な浮動小数点値の解析時、たとえば変換指定子 変換指定が無効な場合、動作は未定義です。 | ||||||||||
戻り値
例
#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)
関連項目
(C99)(C99)(C99)(C11)(C11)(C11) |
可変引数リストを使用して stdin, ファイルストリーム またはバッファから書式付きワイド文字入力を読み取ります (関数) |
C++ ドキュメント wscanf, fwscanf, swscanf
| |