wscanf, fwscanf, swscanf, wscanf_s, fwscanf_s, swscanf_s
|
헤더 파일에 정의됨
<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
에 따라 해석하고 결과를 주어진 위치에 저장합니다.
stream
에서 데이터를 읽습니다.
buffer
에서 데이터를 읽습니다. 문자열의 끝에 도달하는 것은
fwscanf
에 대해 파일 끝 조건에 도달하는 것과 동일합니다.
-
- 포인터 타입 인수 중 하나가 널 포인터인 경우
-
format,stream, 또는buffer가 널 포인터인 경우 -
%
c
,
%
s
, 또는
%
[
에 의해 기록될 문자 수와 종료 널 문자를 더한 값이 해당 변환 지정자에 제공된 두 번째 (
rsize_t) 인수를 초과하는 경우 - 선택적으로, 알 수 없는 변환 지정자와 같은 다른 검출 가능한 오류
-
모든 경계 검사 함수들과 마찬가지로,
wscanf_s,fwscanf_s, 그리고swscanf_s는 구현체가 __STDC_LIB_EXT1__ 를 정의하고 사용자가 <wchar.h> 를 포함하기 전에 __STDC_WANT_LIB_EXT1__ 를 정수 상수 1 으로 정의한 경우에만 사용 가능함이 보장됩니다.
목차 |
매개변수
| stream | - | 입력 파일 스트림 (읽기용) |
| buffer | - | 널 종료 와이드 문자열을 읽을 포인터 |
| format | - | 입력 읽기 방식을 지정하는 널 종료 와이드 문자열 포인터 |
| ... | - | 수신 인자들 |
format
문자열은 다음으로 구성됩니다
- 공백 문자가 아닌 와이드 문자 중 % 를 제외한 문자: 형식 문자열 내의 각 해당 문자는 입력 스트림에서 정확히 하나의 동일한 문자를 소비하거나, 스트림의 다음 문자가 동일하지 않을 경우 함수가 실패하도록 합니다.
- 공백 문자: 형식 문자열 내의 단일 공백 문자는 입력에서 사용 가능한 모든 연속된 공백 문자를 소비합니다(루프에서 iswspace 를 호출하는 것처럼 결정됨). 형식 문자열에서 " \n " , " " , " \t \t " 또는 기타 공백 사이에는 차이가 없습니다.
- 변환 지정자. 각 변환 지정자는 다음 형식을 가집니다:
-
- 서론 % 문자.
-
- (선택적) 할당 억제 문자 * . 이 옵션이 존재하면, 함수는 변환 결과를 어떤 수신 인자에도 할당하지 않습니다.
-
- (선택적) 0보다 큰 정수로, 현재 변환 지정자에 의해 지정된 변환을 수행할 때 함수가 소비할 수 있는 최대 문자 수인 최대 필드 너비 를 지정합니다. % s 및 % [ 의 경우 너비가 제공되지 않으면 버퍼 오버플로우가 발생할 수 있습니다.
-
- (선택 사항) length modifier 는 수신 인수의 크기, 즉 실제 대상 유형을 지정합니다. 이것은 변환 정확도와 오버플로 규칙에 영향을 미칩니다. 기본 대상 유형은 각 변환 유형마다 다릅니다(아래 표 참조).
-
- 변환 형식 지정자.
다음 형식 지정자를 사용할 수 있습니다:
|
변환
지정자 |
설명 |
예상
인수 타입 |
||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 길이 수정자→ |
hh
|
h
|
없음 |
l
|
ll
|
j
|
z
|
t
|
L
|
|
| C99 이후로만 사용 가능→ | Yes | Yes | Yes | Yes | Yes | |||||
%
|
리터럴
%
와 일치합니다.
|
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
*
|
size_t
*
|
해당 없음 | ||
i
|
정수 와 매칭됩니다.
|
|||||||||
u
|
부호 없는 십진수 정수 와 일치합니다.
|
|||||||||
o
|
부호 없는 8진수 정수 와 매칭됩니다.
|
|||||||||
x
X
|
부호 없는 16진수 정수 와 일치합니다.
|
|||||||||
n
|
지금까지 읽은 문자 수 를 반환합니다.
|
|||||||||
a
(C99)
A
(C99)
e
E
f
F
(C99)
g
G
|
부동 소수점 숫자 와 매칭됩니다.
|
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 |
| 참고 사항 | ||||||||||
|
n 이외의 모든 변환 지정자에 대해, 지정된 필드 너비를 초과하지 않으며 변환 지정자가 기대하는 시퀀스와 정확히 일치하거나 해당 시퀀스의 접두사인 입력 문자들의 가장 긴 시퀀스가 스트림에서 소비됩니다. 소비된 시퀀스 이후의 첫 번째 문자(있는 경우)는 읽히지 않은 상태로 남습니다. 소비된 시퀀스의 길이가 0이거나 소비된 시퀀스가 위에서 명시된 대로 변환될 수 없는 경우, 스트림에서의 입력을 방해한 파일 끝, 인코딩 오류 또는 읽기 오류가 아닌 한 매칭 실패가 발생합니다. [ , c , 그리고 n 을 제외한 모든 변환 지정자는 입력을 구문 분석하기 전에 모든 선행 공백 문자들( iswspace 를 호출하는 것처럼 결정됨)을 소비하고 버립니다. 이러한 소비된 문자들은 지정된 최대 필드 너비에 포함되지 않습니다. 길이 지정자 l 이 사용되지 않으면, 변환 지정자 c , s , 그리고 [ 은 첫 번째 문자가 변환되기 전에 0으로 초기화된 mbstate_t 객체로 wcrtomb 를 호출하는 것처럼 와이드-투-멀티바이트 문자 변환을 수행합니다. 변환 지정자 s 와 [ 은 항상 매칭된 문자들에 추가로 널 종결자를 저장합니다. 대상 배열의 크기는 지정된 필드 너비보다 최소한 하나 더 커야 합니다. 대상 배열 크기를 지정하지 않고 % s 또는 % [ 를 사용하는 것은 gets 와 마찬가지로 안전하지 않습니다.
고정 너비 정수 타입
(
int8_t
등)에 대한 올바른 변환 지정자는 헤더
각 변환 지정자의 동작 이후에는 시퀀스 포인트 가 있습니다; 이는 여러 필드를 동일한 "싱크" 변수에 저장하는 것을 허용합니다. 지수 부분에 숫자가 없이 끝나는 불완전한 부동 소수점 값을 구문 분석할 때, 예를 들어 변환 지정자 % f 로 "100er" 를 구문 분석하는 경우, "100e" (유효한 부동 소수점 숫자의 가능한 가장 긴 접두사) 시퀀스가 소비되어, 매칭 오류(소비된 시퀀스를 부동 소수점 숫자로 변환할 수 없음)가 발생하고 "r" 이 남습니다. 일부 기존 구현체는 이 규칙을 따르지 않고 "100" 만 소비하도록 롤백하여 "er" 을 남깁니다, 예를 들어 glibc 버그 1765 . 변환 명세가 유효하지 않으면, 동작은 정의되지 않습니다. |
||||||||||
반환값
예제
#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
참고문헌
- 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++ 문서
for
wscanf
,
fwscanf
,
swscanf
|
|