SCANF(3)

명칭
scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf - 입력의 포맷 변환

프로그램 라이브러리
libc

서식
<stdio.h> int scanf(const char *format, ...) int fscanf(FILE *stream, const char *format, ...) int sscanf(const char *str, const char *format, ...) <stdarg.h> int vscanf(const char *format, va_list ap) int vsscanf(const char *str, const char *format, va_list ap) int vfscanf(FILE *stream, const char *format, va_list ap)

해설
scanf() 함수 패밀리는, 후술 한다 format 에 따라 입력을 주사 합니다. 이 포맷에는 변환 지시자 (을)를 포함할 수가 있습니다. 이러한 변환이 있을 때, 그 결과는 포인터 인수를 개입시켜 격납됩니다. scanf() 함수는 입력을 표준 입력 스트림 stdin (으)로부터 읽어냅니다. fscanf() (은)는 입력을 스트림 포인터 stream (으)로부터 읽어냅니다. sscanf() (은)는 입력을 str (이)가 가리키는 캐릭터 캐릭터 라인으로부터 읽어냅니다. vfscanf() 함수는, vfprintf(3) 에 유사하고 있어, 포인터의 가변 인수 리스트 ( stdarg(3) (을)를 참조) (을)를 사용해, 스트림 포인터 stream (으)로부터 입력을 읽어냅니다. vscanf() 함수는 표준 입력으로부터, vsscanf() 함수는 캐릭터 라인으로부터 가변 인수 리스트를 주사 합니다. 이러한 함수는 각각 vprintf() 함수와 vsprintf() 함수에 유사하고 있습니다. 연속한 각 포인터 인수는, 연속한 각각의 변환 지시자와 적절히 대응하고 있을 필요가 있습니다 (다만, 후술의 `억제'를 참조). 변환 지시자는 모두 % 캐릭터 (퍼센트 부호)로 시작됩니다. format 캐릭터 라인에는, 다른 캐릭터도 포함할 수가 있습니다. format 캐릭터 라인내의 공백 (공백이나 탭, 개행등)은, 공백 없음을 포함한 임의의 양의 공백과 일치합니다. 그 외의 캐릭터는 모두 그것 자신과만 일치합니다. 입력 캐릭터가 그러한 포맷 캐릭터와 일치하지 않게 되었을 때에 주사는 정지합니다. 주사는, 입력 변환을 실시할 수 없을 때에도 정지합니다 (아래와 같이 참조).

변환
변환의 선두가 된다 % 캐릭터에 이어, 이하에 주는 몇개의 플래그 캐릭터를 둘 수가 있습니다.

*   할당의 억제. 이것에 계속되는 변환은 평상시 대로에 행해집니다만, 포인터는 사용되지 않습니다. 변환의 결과는 단지 폐기됩니다.

h   변환이 dioux 또는 n 의 어떤 것인가여, 다음의 포인터는 ( int (은)는 아니고) short int (을)를 가리키는 포인터인 것을 나타냅니다.

l   변환이 dioux 또는 n 의 어떤 것인가여, 다음의 포인터가 ( int (은)는 아니고) long int (을)를 가리키는 포인터인 것, 혹은 변환은 efg 의 어떤 것인가여, 다음의 포인터는 ( float (은)는 아니고) double (을)를 가리키는 포인터인 것을 나타냅니다.

L   변환이 efg (이어)여, 다음의 포인터가 long double (을)를 가리키는 포인터인 것을 나타냅니다 (이 타입은 실장되고 있지 않습니다. L 플래그는 현시점에서는 무시됩니다).

q   변환이 dioux 또는 n 의 어떤 것인가여, 다음의 포인터가 ( int (은)는 아니고) long long int (을)를 가리키는 포인터인 것을 나타냅니다.

이러한 플래그에 가세해, 옵션으로서 10 진정수로 나타내지는 최대 필드폭을 % (와)과 변환동안에 두는 일도 가능합니다. 필드폭을 지정하지 않는 경우, 디폴트의 `무한'가 사용됩니다 (예외가 1 개 있습니다. 후술). 필드폭을 지정했을 경우, 변환 처리에 대해 최대로 그 수의 캐릭터가 주사 됩니다. 변환이 시작되기 전에, 대부분의 변환은 공백을 스킵 합니다. 이 공백은 필드폭의 카운트 대상으로는 되지 않습니다.

이하의 변환을 이용할 수 있습니다.

%   리터럴의 `%'와 일치합니다. 즉, 포맷 캐릭터 라인내의 `%%'는, 1 개의 입력 캐릭터 `%'와 일치합니다. 변환은 행해지지 않고, 할당은 행해지지 않습니다.

d   부호의 유무에 관련되지 않고, 10 진정수에 일치합니다. 다음의 포인터는 int (을)를 가리키는 포인터일 필요가 있습니다.

D   ld (와)과 동등합니다. 이것은 후방 호환성을 위해서(때문에)만 존재하고 있습니다.

i   부호의 유무에 관련되지 않고, 정수에 일치합니다. 다음의 포인터는 int (을)를 가리키는 포인터일 필요가 있습니다. 정수가 ‘0x’ 또는 ‘0X’ 그리고 시작되는 경우, 정수를 기수 16 으로 읽어냅니다. ‘0’ 그리고 시작되는 경우, 기수 8 으로 읽어냅니다. 그 이외의 경우는, 기수 10 입니다. 기수에 대응하는 캐릭터만이 사용됩니다.

o   8 진정수로 일치합니다. 다음의 포인터는 unsigned int (을)를 가리키는 포인터일 필요가 있습니다.

O   lo (와)과 동등합니다. 이것은 후방 호환성을 위해서(때문에) 존재하고 있습니다.

u   부호의 유무에 관련되지 않고, 10 진정수로 일치합니다. 다음의 포인터는 unsigned int (을)를 가리키는 포인터일 필요가 있습니다.

x   부호의 유무에 관련되지 않고, 16 진정수에 일치합니다. 다음의 포인터는 unsigned int (을)를 가리키는 포인터일 필요가 있습니다.

X   lx (와)과 동등합니다. 이것은 isoC 위반입니다만, 이전의 UNIX 시스템과는 후방 호환성이 있습니다.

f   부호의 유무에 관련되지 않고, 부동 소수점수(실수)와 일치합니다. 다음의 포인터는 float (을)를 가리키는 포인터일 필요가 있습니다.

e   f (와)과 동등합니다.

g   f (와)과 동등합니다.

E   lf (와)과 동등합니다. 이것은 isoC 위반입니다만, 이전의 UNIX 시스템과는 후방 호환성이 있습니다.

F   lf (와)과 동등합니다. 이것은 후방 호환성을 위해서(때문에)만 존재합니다.

s   비공백 캐릭터의 순차 순서와 일치합니다. 다음의 포인터는 char (을)를 가리키는 포인터일 필요가 있어, 배열은 모든 순차 순서와 종단의 NUL 캐릭터를 받아들이는데 충분할 뿐(만큼) 클 필요가 있습니다. 입력 캐릭터 라인은, 공백, 또는 최대 필드폭의 어느 쪽인지가 최초로 발생한 장소에서 정지합니다.

c   width 개 (디폴트 1)의 캐릭터의 순차 순서에 일치합니다. 다음의 포인터는 char (을)를 가리키는 포인터일 필요가 있어, 모든 캐릭터에 대해서 충분한 여지가 있을 필요가 있습니다 (종단의 NUL (은)는 추가되지 않습니다). 통상 행해지는 선두의 공백 스킵은 억제됩니다. 최초의 공백을 스킵 하려면 , 포맷내에 명시적인 스페이스를 사용해 주세요.

[   지정된 수락 캐릭터 집합으로부터 되는, 하늘이 아닌 캐릭터 라인과 일치합니다. 다음의 포인터는, char (을)를 가리키는 포인터일 필요가 있어, 캐릭터 라인내의 모든 캐릭터에 가세해 종단의 NUL 몬지를 들어갈 수 있는 충분한 여지가 있을 필요가 있습니다. 통상 행해지는 선두의 공백 스킵은 억제됩니다. 캐릭터 라인은, 특정의 집합내의 (또는 집합외의) 캐릭터로 구성됩니다. 이 집합은, 열림 꺽쇄묶음 [ 문자라고 덮고 꺽쇄묶음] 캐릭터의 사이의 캐릭터에 의해 정의됩니다. 집합은, 열림 꺽쇄묶음의 직후의 캐릭터가 곡절 엑센트 기호 ^ 인 경우, 이러한 캐릭터를 제외 합니다. 집합내에 닫고 꺽쇄묶음을 넣으려면 , 닫고 꺽쇄묶음을 열림 꺽쇄묶음 또는 곡절 엑센트 기호의 직후의 캐릭터로 합니다. 그 외의 위치에 두면(자) 집합을 종료시킵니다. 하이픈 캐릭터 - 도 특수합니다. 다른 2 개의 캐릭터 사이에 놓여졌을 경우, 하이픈은 사이에 접어드는 모든 캐릭터를 집합에 추가합니다. 하이픈을 넣기 위해서(때문에)는, 하이픈을 마지막 닫고 꺽쇄묶음의 직전의 캐릭터로 합니다. 예를 들어, ‘[^]0-9-]’ (은)는,`닫고 꺽쇄묶음, 0 에서 9, 및 하이픈 이외의 모두' 의 집합을 의미합니다. 캐릭터 라인은, 집합내에 없다 (또는 곡절 엑센트 기호가 있는 집합에 포함된다) 캐릭터가 출현하는지, 또는 필드폭이 다했을 때에 종료합니다.

p   ( printf(3) 그리고 ‘%p’ 그리고 인자된) 포인터의 값과 일치합니다. 다음의 포인터는 void (을)를 가리키는 포인터일 필요가 있습니다.

n   아무것도 예기 하지 않습니다. 그 대신해, 입력 이후 소비된 캐릭터의 개수가 다음의 포인터를 개입시켜 보존됩니다. 다음의 포인터는 int (을)를 가리키는 포인터일 필요가 있습니다. 이것은 변환에서는 없습니다. 다만 * 플래그로 억제할 수 있습니다.

후방 호환성을 위해서(때문에), 다른 변환 캐릭터 ( ‘\0’ (을)를 제외한다)는 ‘%d’ 인것 같이, 또는 대문자의 경우는 ‘%ld’ 인것 같이 다루어져 ‘%\0’ 의 변환은 즉시 EOF (을)를 되돌립니다. F (와)과 X 의 변환은, 장래 ANSI C 표준에 적합하도록(듯이) 변경될 예정이므로, 그 후에서는, 이러한 변환은 각각 f (와)과 x (와)과 같이 동작하겠지요.

반환값
이러한 함수는, 할당할 수 있었던 입력 항목수를 돌려줍니다. 일치가 성공하지 않았던 경우, 이 수는 준비된 것보다 적고, 또는 0 이 되는 것 조차 있습니다. 0 은, 이용할 수 있는 입력이 있었지만, 변환을 할당할 수 없었던 것을 나타냅니다. 통상, 이것은 ‘%d’ 변환에 대한 알파벳 캐릭터등과 같은, 무효인 입력 캐릭터이기 때문에입니다. 하등의 변환이 발생하기 전에, 파일의 끝과 같은 일로 입력 처리가 실패했을 경우는, 값 EOF 하지만 돌려주어집니다. 변환이 개시한 다음에, 에러 또는 파일의 끝이 발생했을 경우, 정상적으로 완료한 변환의 수가 돌려주어집니다.

관련 항목
getc(3), printf(3), strtod(3), strtol(3), strtoul(3)

표준
함수 fscanf(), scanf() 및 sscanf() 하 isoC 에 적합하고 있습니다.

역사
함수 vscanf(), vsscanf() 및 vfscanf() (은)는 이 릴리스로 처음 등장했습니다.

버그
변환 %F (와)과 %X 의 현재의 상황은 무례한 상태에 있습니다.

모든 후방 호환 포맷은, 장래 제거됩니다.

수치 캐릭터 라인은 512 캐릭터에 잘라 버릴 수 있습니다. 예를 들어, %f (와)과 %d (은)는 사실상 %512f (와)과 %512d 입니다.