Namespaces
Variants

vwscanf, vfwscanf, vswscanf, vwscanf_s, vfwscanf_s, vswscanf_s

cppreference.net에서
 
 
파일 입출력
타입과 객체
        
함수
파일 접근
(C95)
비형식 입출력
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

형식 입력
 
헤더 <wchar.h>
int vwscanf( const wchar_t *restrict format, va_list vlist );
에 정의됨 (1) (C99 이후)
int vfwscanf( FILE *restrict stream,
              const wchar_t *restrict format, va_list vlist );
(2) (C99 이후)
int vswscanf( const wchar_t *restrict buffer,
              const wchar_t *restrict format, va_list vlist );
(3) (C99 이후)
int vwscanf_s( const wchar_t *restrict format, va_list vlist );
(4) (C11 이후)
int vfwscanf_s( FILE *restrict stream,
                const wchar_t *restrict format, va_list vlist );
(5) (C11 이후)
int vswscanf_s( const wchar_t *restrict buffer,
                const wchar_t *restrict format, va_list vlist );
(6) (C11 이후)

다양한 소스에서 데이터를 읽고, format에 따라 해석하며, 그 결과를 vlist에 정의된 위치에 저장합니다.

1) stdin에서 데이터를 읽습니다.
2) 파일 스트림 stream에서 데이터를 읽습니다.
3) 널 종료 와이드 문자열 buffer에서 데이터를 읽습니다. 문자열의 끝에 도달하는 것은 fwscanf
의 파일 끝 조건에 도달하는 것과 동일합니다.4-6) (1-3)%c과 동일하지만, %s, %[ 변환 지정자는 각각 두 개의 인수(일반적인 포인터와 수신 배열의 크기를 나타내는 rsize_t 형식의 값, %lc로 단일 와이드 문자를 읽는 경우 1일 수 있음)를 기대하며, 또한 다음 오류들이 런타임에 감지되어 현재 설치된 제약 조건 처리기 함수를 호출한다는 점이 다릅니다:
  • 포인터 형식의 인수 중 하나가 널 포인터인 경우
  • format, stream, 또는 buffer가 널 포인터인 경우
  • %c, %s, 또는  %[로 쓰여질 문자 수에 종료 널 문자를 더한 값이 각 해당 변환 지정자에 대해 제공된 두 번째(rsize_t) 인수를 초과하는 경우
  • 선택적으로, 알 수 없는 변환 지정자와 같이 감지 가능한 다른 오류
모든 경계 검사 함수와 마찬가지로, vwscanf_s, vfwscanf_s, vswscanf_s는 구현이 __STDC_LIB_EXT1__를 정의하고 사용자가 __STDC_WANT_LIB_EXT1__를 정수 상수 1로 정의한 후 <stdio.h>를 포함하는 경우에만 사용 가능함이 보장됩니다.

매개변수

stream - 데이터를 읽을 입력 파일 스트림
buffer - 널 종료 와이드 문자열을 가리키는 포인터
format - 입력을 읽는 방법을 지정하는 널 종료 와이드 문자열을 가리키는 포인터
vlist - 수신 인수를 포함하는 가변 인수 목록.


format 문자열은 다음으로 구성됩니다:

  • %를 제외한 공백이 아닌 와이드 문자: 형식 문자열의 각 문자는 입력 스트림의 정확히 하나의 동일한 문자를 소비하거나, 스트림의 다음 문자가 동일하지 않으면 함수를 실패하게 합니다.
  • 공백 문자: 형식 문자열의 단일 공백 문자는 입력에서 사용 가능한 모든 연속 공백 문자를 소비합니다(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

문자 또는 문자의 시퀀스와 일치합니다.

  • 너비 지정자가 사용되면 정확히 너비개의 와이드 문자와 일치합니다(인수는 충분한 공간이 있는 배열을 가리키는 포인터여야 함).
  • %s 및  %[와 달리 배열에 널 문자를 추가하지 않습니다.
N/A N/A
char*
wchar_t*
N/A N/A N/A N/A N/A
s

공백이 아닌 문자의 시퀀스(문자열)와 일치합니다.

  • 너비 지정자가 사용되면 최대 너비까지 또는 첫 번째 공백 문자까지 중 먼저 나타나는 것까지 일치합니다.
  • 일치된 문자 외에도 항상 널 문자를 저장합니다(따라서 인수 배열에는 최소 width+1개의 문자가 들어갈 공간이 있어야 함).
[집합 ]

문자 집합에서 비어 있지 않은 문자 시퀀스와 일치합니다.

  • 집합의 첫 번째 문자가 ^이면 집합에 없는 모든 문자와 일치합니다.
  • 집합이 ] 또는 ^]로 시작하면 ] 문자도 집합에 포함됩니다.
  • 스캔셋의 첫 번째 위치가 아닌 - 문자가 [0-9]에서와 같이 범위를 나타낼 수 있는지는 구현 정의입니다.
  • 너비 지정자가 사용되면 최대 너비까지만 일치합니다.
  • 일치된 문자 외에도 항상 널 문자를 저장합니다(따라서 인수 배열에는 최소 width+1개의 문자가 들어갈 공간이 있어야 함).
d

십진 정수와 일치합니다.

  • 숫자의 형식은 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)

부호 없는 이진 정수와 일치합니다.

  • 숫자의 형식은 wcstoul에서 2 인수 값 base으로 예상하는 것과 동일합니다.
i

정수와 일치합니다.

  • 숫자의 형식은 wcstol에서 0 인수 값 base으로 예상하는 것과 동일합니다(기본은 구문 분석된 첫 번째 문자에 의해 결정됨).
u

부호 없는 십진 정수와 일치합니다.

  • 숫자의 형식은 wcstoul에서 10 인수 값 base으로 예상하는 것과 동일합니다.
o

부호 없는 팔진 정수와 일치합니다.

  • 숫자의 형식은 wcstoul에서 8 인수 값 base으로 예상하는 것과 동일합니다.
x
X

부호 없는 십육진 정수와 일치합니다.

  • 숫자의 형식은 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를 제외한 모든 변환 지정자의 경우, 지정된 필드 너비를 초과하지 않으면서 변환 지정자가 정확히 기대하는 입력 문자 시퀀스 또는 기대하는 시퀀스의 접두사인 가장 긴 입력 문자 시퀀스가 스트림에서 소비됩니다. 이 소비된 시퀀스 이후의 첫 번째 문자(있는 경우)는 읽히지 않은 상태로 남습니다. 소비된 시퀀스의 길이가 0이거나 소비된 시퀀스를 위에 지정된 대로 변환할 수 없으면, 파일 끝, 인코딩 오류 또는 읽기 오류가 스트림에서 입력을 방해하지 않는 한 일치 실패가 발생하며, 그렇지 않으면 입력 실패입니다.

% 지정자를 제외하고, 입력 항목(또는 %n의 경우 입력 문자 수)은 먼저 변환 지정자에 적합한 유형으로 변환됩니다. *로 할당이 억제되지 않은 경우, 변환 결과는 아직 쓰여지지 않은 다음 인수가 가리키는 객체에 기록됩니다. 이 객체가 적절한 유형이 아니거나 변환 결과를 객체에 표현할 수 없으면 동작이 정의되지 않습니다.

[, c, n를 제외한 모든 변환 지정자는 입력 구문 분석을 시도하기 전에 모든 선행 공백 문자를 소비하고 버립니다(iswspace를 호출하는 것처럼 결정됨). 이러한 소비된 문자는 지정된 최대 필드 너비에 계산되지 않습니다.

길이 지정자 l를 사용하지 않으면 변환 지정자 c, s, [는 첫 번째 문자가 변환되기 전에 0으로 초기화된 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도 반환됩니다.

참고

이 함수들은 모두 va_arg를 호출할 수 있으며, 반환 후 arg의 값은 불확정입니다. 이 함수들은 va_end를 호출하지 않으므로 호출자가 호출해야 합니다.

예제

참조

  • C11 표준 (ISO/IEC 9899:2011):
  • 7.29.2.6 vfwscanf 함수 (p: 418)
  • 7.29.2.8 vswscanf 함수 (p: 419)
  • 7.29.2.10 vwscanf 함수 (p: 420)
  • K.3.9.1.7 vfwscanf_s 함수 (p: 632-633)
  • K.3.9.1.10 vswscanf_s 함수 (p: 635-636)
  • K.3.9.1.12 vwscanf_s 함수 (p: 637)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.24.2.6 vfwscanf 함수 (p: 364)
  • 7.24.2.8 vswscanf 함수 (p: 365)
  • 7.24.2.10 vwscanf 함수 (p: 366)

같이 보기

stdin, 파일 스트림 또는 버퍼에서 형식화된 와이드 문자 입력을 읽습니다
(함수)
C++ 문서 for vwscanf, vfwscanf, vswscanf