vscanf, vfscanf, vsscanf, vscanf_s, vfscanf_s, vsscanf_s
| 헤더에 정의됨 <stdio.h>
|
||
int vscanf( const char* restrict format, va_list vlist );
|
(1) | (C99부터) |
int vfscanf( FILE* restrict stream, const char* restrict format,
va_list vlist );
|
(2) | (C99부터) |
int vsscanf( const char* restrict buffer, const char* restrict format,
va_list vlist );
|
(3) | (C99부터) |
int vscanf_s(const char* restrict format, va_list vlist);
|
(4) | (C11부터) |
int vfscanf_s( FILE* restrict stream, const char* restrict format,
va_list vlist);
|
(5) | (C11부터) |
int vsscanf_s( const char* restrict buffer, const char* restrict format,
va_list vlist);
|
(6) | (C11부터) |
다양한 소스에서 데이터를 읽고, format에 따라 해석하여 그 결과를 vlist로 정의된 위치에 저장합니다.
streambuffer에서 데이터를 읽습니다. 문자열의 끝에 도달하는 것은 fscanf%c, %s, %[ 변환 지정자가 각각 두 개의 인수(일반적인 포인터와 rsize_t 형식의 값으로 수신 배열의 크기를 나타내며, %c로 단일 char에 읽을 때는 1이 될 수 있음)를 기대하고, 또한 다음 오류들이 런타임에 감지되어 현재 설치된 제약 조건 처리기 함수를 호출한다는 점이 다릅니다:
- 포인터 형식 인수 중 하나라도 널 포인터인 경우
format,stream, 또는buffer이 널 포인터인 경우- %c, %s, 또는 %[에 종료 널 문자를 더한 값이 해당 변환 지정자 각각에 대해 제공된 두 번째 (rsize_t) 인수를 초과하는 경우
- 선택적으로, 알 수 없는 변환 지정자와 같은 다른 감지 가능한 오류
vscanf_s, vfscanf_s, vsscanf_s는 구현이 __STDC_LIB_EXT1__을 정의하고 사용자가 __STDC_WANT_LIB_EXT1__을 정수 상수 1로 정의한 후 <stdio.h>를 포함하는 경우에만 사용할 수 있습니다.매개변수
| stream | - | 읽을 입력 파일 스트림 |
| buffer | - | 읽을 null 종료 문자 문자열을 가리키는 포인터 |
| format | - | 입력을 읽는 방법을 지정하는 null 종료 문자 문자열을 가리키는 포인터 |
| vlist | - | 수신 인수를 포함하는 가변 인수 목록. |
format 문자열은 다음으로 구성됩니다:
- 공백이 아닌 멀티바이트 문자 (
%제외): 형식 문자열의 각 문자는 입력 스트림에서 정확히 동일한 문자 하나를 소비하거나, 스트림의 다음 문자가 같지 않으면 함수가 실패하게 합니다. - 공백 문자: 형식 문자열의 단일 공백 문자는 입력에서 사용 가능한 모든 연속된 공백 문자를 소비합니다 (마치 isspace를 루프에서 호출하는 것처럼 결정됨). 참고로 형식 문자열에서
"\n"," ","\t\t"또는 기타 공백 문자 사이에는 차이가 없습니다. - 변환 지정. 각 변환 지정은 다음 형식을 가집니다:
- 시작
%문자.
- 시작
- (선택 사항) 할당 억제 문자
*. 이 옵션이 있으면 함수는 변환 결과를 수신 인수에 할당하지 않습니다.
- (선택 사항) 할당 억제 문자
- (선택 사항) 최대 필드 너비를 지정하는 정수 (0보다 큼). 즉, 현재 변환 지정에 의해 지정된 변환을 수행할 때 함수가 소비할 수 있는 최대 문자 수입니다. 참고로 너비가 제공되지 않으면
%s및%[는 버퍼 오버플로를 초래할 수 있습니다.
- (선택 사항) 최대 필드 너비를 지정하는 정수 (0보다 큼). 즉, 현재 변환 지정에 의해 지정된 변환을 수행할 때 함수가 소비할 수 있는 최대 문자 수입니다. 참고로 너비가 제공되지 않으면
- (선택 사항) 수신 인수의 크기, 즉 실제 대상 유형을 지정하는 길이 수정자. 이는 변환 정확도 및 오버플로 규칙에 영향을 미칩니다. 기본 대상 유형은 각 변환 유형마다 다릅니다 (아래 표 참조).
- 변환 형식 지정자.
다음 형식 지정자를 사용할 수 있습니다:
| 변환 지정자 |
설명 | 예상 인수 유형 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 길이 수정자→ | hh
|
h
|
없음 | l
|
ll
|
j
|
z
|
t
|
L
| |
| C99부터만 사용 가능→ | 예 | 예 | 예 | 예 | 예 | |||||
%
|
리터럴
%와 일치. |
해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 |
c
|
문자 또는 문자 시퀀스와 일치.
|
해당 없음 | 해당 없음 | char* |
wchar_t* |
해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 |
s
|
공백이 아닌 문자 시퀀스 (문자열)와 일치.
| |||||||||
[집합 ]
|
집합의 문자 중 비어 있지 않은 시퀀스와 일치.
| |||||||||
d
|
십진 정수와 일치.
|
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* |
해당 없음 |
b (C23)
|
부호 없는 이진 정수와 일치.
| |||||||||
i
|
정수와 일치.
| |||||||||
u
|
부호 없는 십진 정수와 일치.
| |||||||||
o
|
부호 없는 팔진 정수와 일치.
| |||||||||
xX
|
부호 없는 십육진 정수와 일치.
| |||||||||
n
|
지금까지 읽은 문자 수를 반환합니다.
| |||||||||
a (C99)A (C99)eEfF (C99)gG
|
부동소수점 숫자와 일치.
|
해당 없음 | 해당 없음 | float* |
double* |
해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | long double* |
p
|
포인터를 정의하는 구현 정의 문자 시퀀스와 일치.
|
해당 없음 | 해당 없음 | void** |
해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 |
| 참고 사항 | ||||||||||
|
변환 지정자 변환 지정자 고정 너비 정수 유형 (int8_t 등)에 대한 올바른 변환 지정은 헤더 <inttypes.h>에 정의되어 있습니다 (단, SCNdMAX, SCNuMAX 등은 각 변환 지정자의 작업 후에는 시퀀스 포인트가 있습니다. 이렇게 하면 동일한 "싱크" 변수에 여러 필드를 저장할 수 있습니다. 지수가 있고 끝에 숫자가 없는 불완전한 부동소수점 값 (예: 변환 지정자 변환 지정이 유효하지 않은 경우 동작은 정의되지 않습니다. | ||||||||||
반환 값
참고 사항
이 모든 함수들은 적어도 한 번 이상
va_arg
를 호출하며, 반환 후
arg
의 값은 정의되지 않습니다. 이러한 함수들은
va_end
를 호출하지 않으며, 호출자가 이를 수행해야 합니다.
예제
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
bool checked_sscanf(int count, const char* buf, const char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
int rc = vsscanf(buf, fmt, ap);
va_end(ap);
return rc == count;
}
int main(void)
{
int n, m;
printf("Parsing '1 2'...");
if (checked_sscanf(2, "1 2", "%d %d", &n, &m))
puts("success");
else
puts("failure");
printf("Parsing '1 a'...");
if (checked_sscanf(2, "1 a", "%d %d", &n, &m))
puts("success");
else
puts("failure");
}
출력:
Parsing '1 2'...success
Parsing '1 a'...failure
참조
- C23 표준 (ISO/IEC 9899:2024):
- 7.21.6.9 vfscanf 함수 (p: TBD)
- 7.21.6.11 vscanf 함수 (p: TBD)
- 7.21.6.14 vsscanf 함수 (p: TBD)
- K.3.5.3.9 vfscanf_s 함수 (p: TBD)
- K.3.5.3.11 vscanf_s 함수 (p: TBD)
- K.3.5.3.14 vsscanf_s 함수 (p: TBD)
- C17 표준 (ISO/IEC 9899:2018):
- 7.21.6.9 vfscanf 함수 (p: TBD)
- 7.21.6.11 vscanf 함수 (p: TBD)
- 7.21.6.14 vsscanf 함수 (p: TBD)
- K.3.5.3.9 vfscanf_s 함수 (p: TBD)
- K.3.5.3.11 vscanf_s 함수 (p: TBD)
- K.3.5.3.14 vsscanf_s 함수 (p: TBD)
- C11 표준 (ISO/IEC 9899:2011):
- 7.21.6.9 vfscanf 함수 (p: 327)
- 7.21.6.11 vscanf 함수 (p: 328)
- 7.21.6.14 vsscanf 함수 (p: 330)
- K.3.5.3.9 vfscanf_s 함수 (p: 597-598)
- K.3.5.3.11 vscanf_s 함수 (p: 599)
- K.3.5.3.14 vsscanf_s 함수 (p: 602)
- C99 표준 (ISO/IEC 9899:1999):
- 7.19.6.9 vfscanf 함수 (p: 293)
- 7.19.6.11 vscanf 함수 (p: 294)
- 7.19.6.14 vsscanf 함수 (p: 295)
참고 항목
(C11)(C11)(C11) |
서식화된 입력을 읽습니다. 입력은 stdin, 파일 스트림 또는 버퍼에서 (함수) |
(C99)(C11)(C11)(C11)(C11) |
서식화된 출력을 출력합니다. 출력 대상은 stdout, 파일 스트림 또는 버퍼 가변 인자 목록을 사용하여 (함수) |
C++ 문서에 대한 vscanf, vfscanf, vsscanf
| |