scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s
|
헤더 파일에 정의됨
<stdio.h>
|
||
| (1) | ||
|
int
scanf
(
const
char
*
format, ...
)
;
|
(C99 이전) | |
|
int
scanf
(
const
char
*
restrict
format, ...
)
;
|
(C99 이후) | |
| (2) | ||
|
int
fscanf
(
FILE
*
stream,
const
char
*
format, ...
)
;
|
(C99 이전) | |
|
int
fscanf
(
FILE
*
restrict
stream,
const
char
*
restrict
format, ...
)
;
|
(C99 이후) | |
| (3) | ||
|
int
sscanf
(
const
char
*
buffer,
const
char
*
format, ...
)
;
|
(C99 이전) | |
|
int
sscanf
(
const
char
*
restrict
buffer,
const
char
*
restrict
format, ...
)
;
|
(C99 이후) | |
|
int
scanf_s
(
const
char
*
restrict
format, ...
)
;
|
(4) | (C11 이후) |
|
int
fscanf_s
(
FILE
*
restrict
stream,
const
char
*
restrict
format, ...
)
;
|
(5) | (C11 이후) |
|
int
sscanf_s
(
const
char
*
restrict
buffer,
const
char
*
restrict
format, ...
)
;
|
(6) | (C11 이후) |
다양한 소스에서 데이터를 읽어와서
format
에 따라 해석하고 결과를 지정된 위치에 저장합니다.
stream
buffer
문자열의 끝에 도달하는 것은
fscanf
에 대해 파일 끝 조건에 도달하는 것과 동일합니다.
-
- 포인터 타입의 인수 중 하나가 null 포인터인 경우
-
format,stream, 또는buffer가 null 포인터인 경우 -
rsize_t) 인자를 초과하는 경우 - 선택적으로, 알 수 없는 변환 지정자와 같은 다른 검출 가능한 오류
-
모든 경계 검사 함수와 마찬가지로,
scanf_s,fscanf_s, 및sscanf_s는 구현에 의해 __STDC_LIB_EXT1__ 가 정의되고 사용자가 <stdio.h> 를 포함하기 전에 __STDC_WANT_LIB_EXT1__ 를 정수 상수 1 으로 정의한 경우에만 사용 가능함이 보장됩니다.
목차 |
매개변수
| stream | - | 읽어올 입력 파일 스트림 |
| buffer | - | 읽어올 널 종료 문자열에 대한 포인터 |
| format | - | 입력을 읽는 방법을 지정하는 널 종료 문자열에 대한 포인터 |
| ... | - | 수신 인자들 |
format
문자열은 다음으로 구성됩니다
- 공백이 아닌 멀티바이트 문자들( % 제외): 형식 문자열 내의 각 해당 문자는 입력 스트림에서 정확히 하나의 동일한 문자를 소비하거나, 스트림의 다음 문자가 동일하지 않을 경우 함수 실패를 유발합니다.
- 공백 문자: 형식 문자열 내의 단일 공백 문자는 입력에서 사용 가능한 모든 연속 공백 문자들을 소비합니다(루프에서 isspace 를 호출하는 것처럼 결정됨). 형식 문자열에서 " \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
|
문자 또는 문자 시퀀스 와 매치됩니다.
|
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
|
부호 없는 10진수 정수 와 매칭됩니다.
|
|||||||||
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 |
| 참고 사항 | ||||||||||
|
변환 지정자
변환 지정자
고정 너비 정수 타입(
각 변환 지정자의 동작 이후에는 시퀀스 포인트가 존재합니다; 이는 여러 필드를 동일한 "싱크" 변수에 저장하는 것을 허용합니다.
지수 부분만 있고 숫자가 없는 불완전한 부동 소수점 값을 파싱할 때(예: 변환 지정자
변환 명세가 유효하지 않은 경우, 동작은 정의되지 않습니다. |
||||||||||
변환 지정이 유효하지 않으면, 동작은 정의되지 않습니다.
반환값
복잡도
보장되지 않습니다. 특히, 일부 구현에서는
sscanf
가
O(N)
인 경우가 있으며, 여기서
N
=
strlen
(
buffer
)
[1]
입니다.
참고 사항
대부분의 변환 지정자는 먼저 연속된 모든 공백을 소비하기 때문에, 다음과 같은 코드는
scanf("%d", &a); scanf("%d", &b);
서로 다른 줄에 입력된 두 정수를 읽을 것입니다(두 번째 % d 가 첫 번째 입력 후 남은 개행 문자를 소비함) 또는 같은 줄에 공백이나 탭으로 구분된 두 정수를 읽을 것입니다(두 번째 % d 가 공백이나 탭을 소비함).
The conversion specifiers that do not consume leading whitespace, such as % c , can be made to do so by using a whitespace character in the format string:scanf("%d", &a); scanf(" %c", &c); // %d 이후의 모든 연속 공백 문자를 소비한 후 문자 하나를 읽음
예제
#define __STDC_WANT_LIB_EXT1__ 1 #include <stdio.h> #include <stddef.h> #include <locale.h> int main(void) { int i, j; float x, y; char str1[10], str2[4]; wchar_t warr[2]; setlocale(LC_ALL, "en_US.utf8"); char input[] = "25 54.32E-1 Thompson 56789 0123 56ß水"; /* 다음과 같이 파싱: %d: 정수 %f: 부동소수점 값 %9s: 최대 9개의 공백이 아닌 문자로 이루어진 문자열 %2d: 두 자리 정수 (숫자 5와 6) %f: 부동소수점 값 (숫자 7, 8, 9) %*d: 어디에도 저장되지 않는 정수 ' ': 모든 연속된 공백 %3[0-9]: 최대 3개의 십진 숫자 문자열 (숫자 5와 6) %2lc: 2개의 와이드 문자, 멀티바이트에서 와이드 변환 사용 */ int ret = sscanf(input, "%d%f%9s%2d%f%*d %3[0-9]%2lc", &i, &x, str1, &j, &y, str2, warr); printf("Converted %d fields:\n" "i = %d\n" "x = %f\n" "str1 = %s\n" "j = %d\n" "y = %f\n" "str2 = %s\n" "warr[0] = U+%x\n" "warr[1] = U+%x\n", ret, i, x, str1, j, y, str2, warr[0], warr[1]); #ifdef __STDC_LIB_EXT1__ int n = sscanf_s(input, "%d%f%s", &i, &x, str1, (rsize_t)sizeof str1); // i에 25, x에 5.432, str1에 9바이트 "Thompson\0"을 기록하고 n에 3을 기록 #endif }
가능한 출력:
Converted 7 fields: i = 25 x = 5.432000 str1 = Thompson j = 56 y = 789.000000 str2 = 56 warr[0] = U+df warr[1] = U+6c34
참조문헌
- C17 표준 (ISO/IEC 9899:2018):
-
- 7.21.6.2 fscanf 함수 (p: 231-236)
-
- 7.21.6.4 scanf 함수 (p: 236-237)
-
- 7.21.6.7 sscanf 함수 (p: 238-239)
-
- K.3.5.3.2 fscanf_s 함수 (p: 430-431)
-
- K.3.5.3.4 scanf_s 함수 (p: 432)
-
- K.3.5.3.7 sscanf_s 함수 (p: 433)
- C11 표준 (ISO/IEC 9899:2011):
-
- 7.21.6.2 fscanf 함수 (p: 317-324)
-
- 7.21.6.4 scanf 함수 (p: 325)
-
- 7.21.6.7 sscanf 함수 (p: 326)
-
- K.3.5.3.2 fscanf_s 함수 (p: 592-593)
-
- K.3.5.3.4 scanf_s 함수 (p: 594)
-
- K.3.5.3.7 sscanf_s 함수 (p: 596)
- C99 표준 (ISO/IEC 9899:1999):
-
- 7.19.6.2 fscanf 함수 (p: 282-289)
-
- 7.19.6.4 scanf 함수 (p: 290)
-
- 7.19.6.7 sscanf 함수 (p: 291)
- C89/C90 표준 (ISO/IEC 9899:1990):
-
- 4.9.6.2 fscanf 함수
-
- 4.9.6.4 scanf 함수
-
- 4.9.6.6 sscanf 함수
참고 항목
|
(C99)
(C99)
(C99)
(C11)
(C11)
(C11)
|
가변 인수 목록을 사용하여
stdin
, 파일 스트림 또는 버퍼에서 형식화된 입력을 읽음
(함수) |
|
파일 스트림에서 문자열을 가져옴
(함수) |
|
|
(C99)
(C11)
(C11)
(C11)
(C11)
|
stdout
, 파일 스트림 또는 버퍼에 형식화된 출력을 인쇄함
(함수) |
|
C++ documentation
for
scanf
,
fscanf
,
sscanf
|
|