fwscanf, wscanf, swscanf 서브루틴

용도

형식이 지정된 와이드 문자 입력을 변환합니다.

라이브러리

표준 라이브러리libc.a

구문

#include <stdio.h>
#include <wchar.h>
int fwscanf (FILE * stream, const wchar_t * format, ...);
int wscanf (const wchar_t * format, ...);
int swscanf (const wchar_t * s, const wchar_t * format, ...);

설명

Fwscanf 함수는 명명된 입력 스트림에서 읽습니다. Wscanf 함수는 표준 입력 스트림 stdin에서 읽습니다. Swscanf 함수는 와이드 문자 문자열 s에서 읽습니다. 각 함수는 와이드 문자를 읽고 형식에 따라 해석한 후 그 결과를 인수에 저장합니다. 각각은 인자로 아래에 설명된 제어 와이드 문자 문자열 형식과 변환된 입력을 저장할 위치를 나타내는 포인터 인자 집합을 기대합니다. 형식에 대한 인수가 충분하지 않으면 결과가 정의되지 않습니다. 인수가 남아 있는 상태에서 형식이 소진되면 초과 인수는 평가되지만 그렇지 않으면 무시됩니다.

변환은 인수 목록의 형식 뒤에 있는 n번째 인수에 적용될 수 있으며, 사용하지 않은 다음 인수는 적용되지 않습니다. 이 경우 변환 와이드 문자 %(아래 참조)는 시퀀스 %n$으로 대체되며, 여기서 n은 [1, {NL_ARGMAX}] 범위의 소수 정숫값입니다. 이 기능은 특정 언어에 적합한 순서로 인수를 선택하는 형식의 와이드 문자 문자열을 정의할 수 있는 기능을 제공합니다. N$ 형식의 변환 사양을 포함하는 형식 와이드 문자 문자열에서 인수 목록의 번호가 지정된 인수를 형식 와이드 문자 문자열에서 두 번 이상 참조할 수 있는지 여부가 지정되지 않았습니다.

형식에는 변환 사양의 두 가지 형식, 즉 % 또는 %n$을 포함할 수 있지만 일반적으로 단일 형식의 와이드 문자 문자열 내에 두 가지 형식을 혼합할 수 없습니다. 유일한 예외는 %% 또는 %*를 %n$ 형식과 혼합할 수 있다는 점입니다.

모든 형태의 fwscanf 함수를 사용하면 입력 문자열에서 언어에 따라 달라지는 기수 문자를 넓은 문자 값으로 인코딩하여 감지할 수 있습니다. 기수 문자는 프로그램의 로캘(카테고리 LC_NUMERIC)에 정의되어 있습니다. POSIX 로캘 또는 기수 문자가 정의되지 않은 로캘에서는 기수 문자의 기본값이 마침표(.)로 설정됩니다.

형식은 0개 이상의 지시어로 구성된 와이드 문자 문자열입니다. 각 지시어는 하나 이상의 공백 와이드 문자(공백, 탭, 새줄, 세로 탭 또는 양식 공급 문자), 일반 와이드 문자(%도 공백 문자도 아님) 또는 변환 사양 중 하나로 구성됩니다. 각 변환 사양은 % 또는 %n$ 시퀀스로 도입되며, 그 뒤에 다음이 순차적으로 표시됩니다:

  • 선택적 할당 억제 문자 *.
  • 최대 필드 너비를 지정하는 0이 아닌 십진수(선택 사항)입니다.
  • 수신 객체의 크기를 나타내는 선택적 크기 수정자 h, H, l (소문자 L), L , D 또는 DD입니다.
    • 해당 인수가 wchar_t에 대한 포인터인 경우 c, s [ 변환 와이드 문자 앞에 l (소문자 L)을 붙여야 합니다.
    • D, in 변환 와이드 문자 앞에는 해당 인수가 짧은 정수에 대한 포인터인 경우 h를, 정수에 대한 포인터인 경우 l (소문자 L)을 붙여야 합니다.
    • ' o, ' u ' 및 ' x 변환 와이드 문자 앞에 해당 인수가 ' 서명되지 않은 짧은 int '에 대한 포인터인 경우 ' h '를, ' 서명되지 않은 긴 int'에 대한 포인터인 경우 l '(소문자 ' L)을 붙여야 합니다.
    • E, f 및 g 변환 와이드 문자 앞에 해당 인수가 더블에 대한 포인터인 경우 l (소문자 L)을, 롱 더블에 대한 포인터인 경우 L을 붙여야 합니다.
    • 해당 인수가 _Decimal32에 대한 포인터인 경우 e, f 및 g 변환 와이드 문자 앞에 H를 붙여야 합니다.
    • 해당 인수가 _Decimal64에 대한 포인터인 경우 e, f 및 g 변환 와이드 문자 앞에 D를 붙여야 합니다.
    • 해당 인수가 _Decimal128에 대한 포인터인 경우 e, f 및 g 변환 와이드 문자 앞에 DD를 붙여야 합니다.
    다른 변환 와이드 문자와 함께 l (소문자 L), L, h, H, D 또는 DD가 나타나면 동작이 정의되지 않은 것입니다.
  • 적용할 변환 유형을 지정하는 변환 와이드 문자입니다. 유효한 변환 와이드 문자는 아래에 설명되어 있습니다.

Fwscanf 함수는 형식의 각 지시어를 차례로 실행합니다. 아래에 설명된 대로 지시어가 실패하면 함수가 반환됩니다. 실패는 입력 실패(입력 바이트를 사용할 수 없어서) 또는 일치 실패(부적절한 입력으로 인해)로 설명됩니다.

하나 이상의 공백 와이드 문자로 구성된 지시어는 더 이상 유효한 입력을 읽을 수 없을 때까지 또는 공백 와이드 문자가 아닌 첫 번째 와이드 문자까지 읽지 않은 채로 입력을 읽어서 실행됩니다.

일반 와이드 문자 지시어는 다음과 같이 실행됩니다. 입력에서 다음 와이드 문자를 읽고 지시어를 구성하는 와이드 문자와 비교하며, 비교 결과 동등하지 않으면 지시어가 실패하고 다른 와이드 문자와 후속 와이드 문자는 읽지 않은 상태로 유지됩니다.

변환 사양인 지시어는 각 변환 와이드 문자에 대해 아래에 설명된 대로 일치하는 입력 시퀀스 집합을 정의합니다. 변환 사양은 다음 단계로 실행됩니다:

변환 사양에 [, c 또는 n 변환 문자가 포함되지 않는 한, 입력 공백 와이드 문자( iswspace로 지정된 대로)는 건너뜁니다.

변환 사양에 n 변환 와이드 문자가 포함되지 않는 한 입력에서 항목을 읽습니다. 입력 항목은 지정된 필드 너비를 초과하지 않는 입력 폭이 넓은 문자의 가장 긴 시퀀스로 정의되며, 이는 일치하는 시퀀스의 초기 시퀀스입니다. 입력 항목 뒤의 첫 번째 와이드 문자(있는 경우)는 읽지 않은 상태로 유지됩니다. 입력 항목의 길이가 0이면 변환 사양의 실행이 실패하며, 파일 끝, 인코딩 오류 또는 읽기 오류로 인해 스트림에서 입력이 차단되지 않는 한 이 조건은 일치 실패입니다(이 경우 입력 실패).

변환 와이드 문자의 경우를 제외하고 입력 항목(또는 %n 변환 사양의 경우 입력 와이드 문자 개수)은 변환 와이드 문자에 적합한 유형으로 변환됩니다. 입력 항목이 일치하는 시퀀스가 아닌 경우 변환 사양의 실행이 실패하며, 이 조건을 일치 실패라고 합니다. 할당 억제가 *로 표시되지 않는 한, 변환 결과는 변환 사양이 %로 도입된 경우 변환 결과를 아직 받지 않은 형식 인수 뒤의 첫 번째 인수가 가리키는 객체에, 와이드 문자 시퀀스 %n$로 도입된 경우 n번째 인수에 배치됩니다. 이 객체에 적절한 유형이 없거나 변환 결과를 제공된 공간에 표현할 수 없는 경우 동작이 정의되지 않습니다.

다음 변환 와이드 문자가 유효합니다:
항목 설명
d 선택적으로 부호가 지정된 십진수를 일치시키며, 형식은 기본 인수에 대한 값 10과 wcstol의 주제 시퀀스에 대해 예상되는 것과 동일한 형식입니다. 크기 수정자가 없는 경우 해당 인수는 int에 대한 포인터여야 합니다.
i 선택적으로 부호가 지정된 정수를 일치시키며, 형식은 기본 인수가 0인 wcstol의 주제 시퀀스에 대해 예상되는 것과 동일합니다. 크기 수정자가 없는 경우 해당 인수는 int에 대한 포인터여야 합니다.
O 선택적으로 부호가 지정된 8진수(기본 인수의 값 8과 wcstoul의 주제 시퀀스에 대해 예상되는 형식과 동일한 형식)를 일치시킵니다. 크기 수정자가 없는 경우 해당 인수는 부호 없는 정수에 대한 포인터여야 합니다.
u 선택적으로 부호가 지정된 십진수를 일치시키며, 형식은 wcstoul의 주제 시퀀스에 대해 예상되는 것과 동일한 형식이고 기본 인수에 10이라는 값을 갖습니다. 크기 수정자가 없는 경우 해당 인수는 부호 없는 정수에 대한 포인터여야 합니다.
X 선택적으로 부호화된 16진수(기본 인수의 값 16과 wcstoul의 주제 시퀀스에 대해 예상되는 형식과 동일한 형식)를 일치시킵니다. 크기 수정자가 없는 경우 해당 인수는 부호 없는 정수에 대한 포인터여야 합니다.
e, f, g 선택적으로 부호화된 부동 소수점 숫자를 일치시키며, 형식은 wcstod 의 주제 시퀀스에 대해 예상되는 것과 동일합니다. 크기 수정자가 없는 경우 해당 인수는 플로트 포인터여야 합니다.
Fwprintf 함수군이 무한대 및 NaN (부동 소수점 형식으로 인코딩된 7858 기호 엔티티)에 대한 문자 문자열 표현을 생성하여 ANSI/IEEE Std 754:1985 표준을 지원하는 경우, fwscanf5함수군은 이를 입력으로 인식합니다.
s 공백이 아닌 넓은 문자의 시퀀스를 일치시킵니다. L(ell) 한정자가 없는 경우 입력 필드의 문자는 첫 번째 와이드 문자가 변환되기 전에 변환 상태를 0으로 초기화하여 마치 wcrtomb 함수를 반복해서 호출하는 것처럼 변환되며, 변환 상태는 mbstate_t 객체로 설명됩니다. 해당 인수는 시퀀스를 수용할 수 있을 만큼 충분히 큰 문자 배열에 대한 포인터와 자동으로 추가되는 종료 널 문자이어야 합니다.
그렇지 않으면 해당 인수는 시퀀스와 끝나는 널 와이드 문자를 수용할 수 있을 만큼 큰 wchar_t 배열에 대한 포인터여야 하며, 이 인수는 자동으로 추가됩니다.
[ 예상되는 와이드 문자 집합( 스캔 세트)에서 비어 있지 않은 와이드 문자 시퀀스를 일치시킵니다. L(ell) 한정자가 없는 경우 입력 필드의 와이드 문자는 첫 번째 와이드 문자가 변환되기 전에 변환 상태를 0으로 초기화하여 마치 wcrtomb 함수를 반복해서 호출하는 것처럼 변환되며, 변환 상태는 mbstate_t 객체로 설명됩니다. 해당 인수는 시퀀스를 수용할 수 있을 만큼 충분히 큰 문자 배열에 대한 포인터와 자동으로 추가되는 종료 널 문자이어야 합니다.
L(ell) 한정자가 있는 경우 해당 인자는 시퀀스와 종료 널 와이드 문자를 수용할 수 있을 만큼 큰 wchar_t 배열에 대한 포인터여야 하며, 이 배열은 자동으로 추가됩니다
변환 사양에는 일치하는 오른쪽 대괄호(])까지 형식 문자열의 모든 후속 와이드 문자가 포함됩니다. 대괄호( 스캔 목록) 사이의 와이드 문자가 스캔 집합을 구성하지만, 왼쪽 대괄호 뒤의 와이드 문자가 꺾쇠(^)인 경우 스캔 집합에는 꺾쇠와 오른쪽 대괄호 사이의 스캔 목록에 나타나지 않는 모든 와이드 문자가 포함됩니다. 변환 사양이 [ ] 또는 [^]로 시작하면 오른쪽 대괄호가 스캔 목록에 포함되고 다음 오른쪽 대괄호가 변환 사양을 끝내는 일치하는 오른쪽 대괄호이며, 그렇지 않은 경우 첫 번째 오른쪽 대괄호가 변환 사양을 끝내는 대괄호입니다. 스캔 목록에 -가 있고 첫 번째 와이드 문자가 아니거나 첫 번째 와이드 문자가 ^;, 마지막 와이드 문자가 아닌 경우, 동작은 구현에 따라 달라집니다.
c 필드 너비로 지정된 숫자의 와이드 문자 시퀀스를 일치시킵니다(변환 사양에 필드 너비가 없는 경우 1). L(ell) 한정자가 없는 경우 입력 필드의 와이드 문자는 첫 번째 와이드 문자가 변환되기 전에 변환 상태를 0으로 초기화하여 마치 wcrtomb 함수를 반복해서 호출하는 것처럼 변환되며, 변환 상태는 mbstate_t 객체로 설명됩니다. 해당 인수는 시퀀스를 수용할 수 있을 만큼 큰 문자 배열에 대한 포인터여야 합니다. Null 문자가 추가되지 않습니다.
그렇지 않으면 해당 인수는 시퀀스를 수용할 수 있을 만큼 충분히 큰 wchar_t 배열에 대한 포인터여야 합니다. 널 와이드 문자가 추가되지 않습니다.
p 구현 종속적인 시퀀스 집합을 일치시키며, 해당 fwprintf 함수의 %p 변환에 의해 생성되는 시퀀스 집합과 동일해야 합니다. 해당 인수는 무효를 가리키는 포인터여야 합니다. 입력 항목의 해석은 구현에 따라 달라집니다. 입력 항목이 동일한 프로그램 실행 중에 이전에 변환된 값인 경우 결과 포인터는 해당 값과 동일하게 비교되며, 그렇지 않은 경우 %p 변환의 동작은 정의되지 않습니다.
n 입력이 소비되지 않습니다. 해당 인수는 이 fwscanf 함수 호출로 지금까지 입력에서 읽은 와이드 문자 수를 기록할 정수에 대한 포인터여야 합니다. N 변환 지정의 실행은 함수 실행 완료 시 반환되는 할당 횟수를 증가시키지 않습니다.
c Lc와 동일합니다.
S Ls와 동일합니다.
% 단일 %와 일치하며 변환이나 할당이 발생하지 않습니다. 전체 변환 사양은 %%여야 합니다.

변환 스펙이 유효하지 않은 경우 작동이 정의되지 않습니다.

변환 문자 E, G 및 X도 유효하며 각각 e, g 및 x와 동일하게 작동합니다.

입력 중에 파일 끝부분이 발생하면 변환이 종료됩니다. 현재 변환 사양(%n 제외)과 일치하는 와이드 문자(허용되는 경우 선행 공백 제외)를 읽기 전에 파일 끝이 발생하면 현재 변환 사양의 실행이 입력 실패로 종료됩니다. 그렇지 않으면 현재 변환 사양의 실행이 일치하는 실패로 종료되지 않는 한, 다음 변환 사양(있는 경우)의 실행이 입력 실패로 종료됩니다.

Swscanf에서 문자열의 끝에 도달하는 것은 fwscanf에서 파일 끝을 만나는 것과 같습니다.

충돌하는 입력에서 변환이 종료되면 문제가 되는 입력은 입력에서 읽지 않은 상태로 남습니다. 변환 사양과 일치하지 않는 한 뒤따르는 공백(줄 바꿈 포함)은 읽지 않은 채로 남습니다. 리터럴 일치 및 억제된 할당의 성공 여부는 %n 변환 사양을 통해서만 직접 확인할 수 있습니다.

Fwscanfwscanf 함수는 업데이트할 스트림과 연결된 파일의 st_atime 필드를 표시할 수 있습니다. St_atime 필드는 이전에 ungetc를 호출하여 제공하지 않은 데이터를 반환하는 스트림을 사용하여 fgetc, fgetwc, fgets, fgetws, fread, getc, getwc, getchar, getwchar, gets, fscanf 또는 fwscanf를 처음 성공적으로 실행하면 업데이트 표시가 됩니다.

변환 사양의 % 형식을 포함하는 형식 문자열에서 인수 목록의 각 인수는 정확히 한 번만 사용됩니다.

리턴 값

성공적으로 완료되면 이 함수는 성공적으로 매칭되고 할당된 입력 항목의 수를 반환하며, 조기 매칭 실패 시 이 숫자는 0이 될 수 있습니다. 첫 번째 매칭 실패 또는 변환 전에 입력이 종료되면 EOF가 반환됩니다. 읽기 오류가 발생하면 스트림에 대한 오류 표시기가 설정되고, EOF가 반환되며, 오류를 나타내는 errno가 설정됩니다.

오류 코드

Fwscanf 함수가 실패할 수 있는 조건과 실패할 수 있는 조건에 대해서는 fgetwc를 참조하세요. 또한 다음과 같은 경우 fwscanf가 실패할 수 있습니다:

항목 설명
EILSEQ 입력 바이트 시퀀스가 유효한 문자를 형성하지 않습니다.
EINVAL 인수가 충분하지 않습니다.

전화:

 int i, n; float x; char name[50];
 n = wscanf(L"%d%f%s", &i, &x, name);

를 입력 줄에 입력합니다:

 25 54.32E-1 Hamster

는 n에 값 3을, i에 값 25를, x에 값 5.432 할당하고 이름에 문자열 Hamster를 포함하게 됩니다.

전화:

 int i; float x; char name[50]; 
 (void) wscanf(L"%2d%f%*d %[0123456789]", &i, &x, name);

를 입력합니다:

 56789 0123 56a72

는 56을 i에, 789.0 x에 할당하고 0123을 건너뛰고 이름에 56\0 문자열을 배치합니다. 다음에 getchar를 호출하면 문자 a가 반환됩니다.