Namespaces
Variants

wscanf, fwscanf, swscanf, wscanf_s, fwscanf_s, swscanf_s

From ko.cppreference.net
< c | io
 
 
파일 입출력
타입과 객체
        
함수
파일 접근
(C95)
비형식 입출력
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

형식 입력
 
헤더 <wchar.h>
int wscanf( const wchar_t* format, ... );
에 정의됨 (1) (C95부터)
(C99까지)
int wscanf( const wchar_t* restrict format, ... );
(C99부터)
int fwscanf( FILE* stream, const wchar_t* format, ... );
(2) (C95부터)
(C99까지)
int fwscanf( FILE* restrict stream,
             const wchar_t* restrict format, ... );
(C99부터)
int swscanf( const wchar_t* buffer, const wchar_t* format, ... );
(3) (C95부터)
(C99까지)
int swscanf( const wchar_t* restrict buffer,
             const wchar_t* restrict format, ... );
(C99부터)
int wscanf_s( const wchar_t* restrict format, ...);
(4) (C11부터)
int fwscanf_s( FILE* restrict stream,
               const wchar_t* restrict format, ...);
(5) (C11부터)
int swscanf_s( const wchar_t* restrict s,
               const wchar_t* restrict format, ...);
(6) (C11부터)

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

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

매개변수

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


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

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

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

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

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

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

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

10진 정수와 일치합니다.

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

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

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

정수와 일치합니다.

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

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

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

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

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

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

  • 숫자의 형식은 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가 반환됩니다.

예제

#include <stdio.h>
#include <string.h>
#include <wchar.h>

#define NUM_VARS   3
#define ERR_READ   2
#define ERR_WRITE  3

int main(void)
{
    wchar_t state[64];
    wchar_t capital[64];
    unsigned int population = 0;
    int elevation = 0;
    int age = 0;
    float pi = 0;

#if INTERACTIVE_MODE
    wprintf(L"Enter state, age, and pi value: ");
    if (wscanf(L"%ls%d%f", state, &age, &pi) != NUM_VARS)
    {
        fprintf(stderr, "Error reading input.\n");
        return ERR_READ;
    }
#else
    wchar_t* input = L"California 170 3.141592";
    if (swscanf(input, L"%ls%d%f", state, &age, &pi) != NUM_VARS)
    {
        fprintf(stderr, "Error reading input.\n");
        return ERR_READ;
    }
#endif
    wprintf(L"State: %ls\nAge  : %d years\nPi   : %.5f\n\n", state, age, pi);

    FILE* fp = tmpfile();
    if (fp)
    {
        // write some data to temp file
        if (!fwprintf(fp, L"Mississippi Jackson 420000 807"))
        {
            fprintf(stderr, "Error writing to file.\n");
            fclose(fp);
            return ERR_WRITE;
        }
        // rewind file pointer
        rewind(fp);

        // read data into variables
        fwscanf(fp, L"%ls%ls%u%d", state, capital, &population, &elevation);
        wprintf(L"State  : %ls\nCapital: %ls\nJackson population (in 2020): %u\n"
                L"Highest elevation: %dft\n",
                state, capital, population, elevation);
        fclose(fp);
    }
}

가능한 출력:

State: California
Age  : 170 years
Pi   : 3.14159

State  : Mississippi
Capital: Jackson
Jackson population (in 2020): 420000
Highest elevation: 807ft

참조

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.29.2.2 fwscanf 함수 (p: TBD)
  • 7.29.2.4 swscanf 함수 (p: TBD)
  • 7.29.2.12 wscanf 함수 (p: TBD)
  • K.3.9.1.2 fwscanf_s 함수 (p: TBD)
  • K.3.9.1.5 swscanf_s 함수 (p: TBD)
  • K.3.9.1.14 wscanf_s 함수 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.29.2.2 fwscanf 함수 (p: TBD)
  • 7.29.2.4 swscanf 함수 (p: TBD)
  • 7.29.2.12 wscanf 함수 (p: TBD)
  • K.3.9.1.2 fwscanf_s 함수 (p: TBD)
  • K.3.9.1.5 swscanf_s 함수 (p: TBD)
  • K.3.9.1.14 wscanf_s 함수 (p: TBD)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.29.2.2 fwscanf 함수 (p: 410-416)
  • 7.29.2.4 swscanf 함수 (p: 417)
  • 7.29.2.12 wscanf 함수 (p: 421)
  • K.3.9.1.2 fwscanf_s 함수 (p: 628-629)
  • K.3.9.1.5 swscanf_s 함수 (p: 631)
  • K.3.9.1.14 wscanf_s 함수 (p: 638)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.24.2.2 fwscanf 함수 (p: 356-362)
  • 7.24.2.4 swscanf 함수 (p: 362)
  • 7.24.2.12 wscanf 함수 (p: 366-367)

같이 보기

stdin, 파일 스트림
또는 버퍼에서 가변 인수 목록을 사용하여 형식화된 와이드 문자 입력을 읽습니다
(함수)
C++ 문서 for wscanf, fwscanf, swscanf