다음을 통해 공유


sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l

문자열에서 형식 데이터를 읽습니다. 이러한 버전의 sscanf, _sscanf_l, swscanf, _swscanf_l에는 CRT의 보안 기능에 설명된 대로 보안 향상 기능이 포함됩니다.

int sscanf_s(
   const char *buffer,
   const char *format [,
   argument ] ...
);
int _sscanf_s_l(
   const char *buffer,
   const char *format,
   locale_t locale [,
   argument ] ...
);
int swscanf_s(
   const wchar_t *buffer,
   const wchar_t *format [,
   argument ] ...
);
int _swscanf_s_l(
   const wchar_t *buffer,
   const wchar_t *format,
   locale_t locale [,
   argument ] ...
);

매개 변수

반환 값

해당 함수는 각각 성공적으로 변환, 배정된 필드 수를 반환합니다. 이때 읽기는 되었지만 지정되지 않은 필드는 반환 값에 포함되지 않습니다. 반환 값 0은 어떤 필드도 할당되지 않았음을 나타냅니다. 오류가 발생하거나 첫 번째 변환 전에 문자열의 끝에 도달할 경우 반환 값은 EOF입니다.

매개 변수 유효성 검사에 설명된 대로 buffer 또는 format이 NULL 포인터인 경우 잘못된 매개 변수 처리기가 호출됩니다. 계속해서 실행하도록 허용된 경우, 이러한 함수는 -1을 반환하고 errno를 EINVAL로 설정합니다.

이러한 오류 코드 및 기타 오류 코드에 대한 자세한 내용은 errno, _doserrno, _sys_errlist 및 _sys_nerr을 참조하십시오.

설명

sscanf_s 함수는 각 argument로 부터 주어진 로캘의 buffer 로 부터 데이터를 읽습니다. 인수 목록의 인수들은 format에서 형식 지정자에 해당하는 형식을 가진 변수에 포인터를 지정합니다. 보안이 취약한 sscanf 버전과 달리, 형식 필드 문자 c, C, s, S 또는 []에 포함된 문자열 제어 집합을 사용할 때 버퍼 크기 매개 변수가 필요합니다. 문자에서 버퍼 크기는 필요로 하는 각 버퍼 매개 변수에 즉시 추가 매개 변수로 제공되어야 합니다. 예를 들어, 문자열로 읽을 경우 해당 문자열에 대한 버퍼 크기는 다음과 같이 전달됩니다.:

wchar_t ws[10];

swscanf_s(in_str, L"%9s", ws, _countof(ws)); // buffer size is 10, width specification is 9

버퍼 크기는 null 종결 문자를 포함합니다. 너비 사양 필드를 사용하여 읽은 토큰이 버퍼에 맞는지 확인할 수 있습니다. 사용된 너비 지정 필드가 없고 토큰 읽기가 버퍼 크기에 비해 너무 큰 경우 해당 버퍼에 아무것도 쓸 수 없습니다.

문자인 경우, 단일 문자를 다음과 같이 읽을 수 있습니다.:

wchar_t wc;

swscanf_s(in_str, L"%c", &wc, 1);

이 예제에서는 입력된 문자열에서 단일 문자를 읽고 와이드 문자 버퍼에 저장합니다. Null 문자로 끝나지 않는 문자열에 대한 여러 개의 문자를 읽을 때, 버퍼 크기와 너비를 지정하는 부호 없는 정수가 사용됩니다.

char c[4];

sscanf_s(input, "%4c", &c, _countof(c)); // not null terminated

자세한 내용은 scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_lscanf 형식 필드 문자를 참조하십시오.

참고

이 크기 매개 변수는 size_t이 아닌 unsigned 형식입니다.

format 인수는 입력 필드의 해석을 제어하고 scanf_s 함수의 format 인수와 동일한 폼과 함수를 가집니다. 중복되는 문자열 간에 복사가 이뤄지면 이 동작은 정의되지 않습니다.

swscanf_s 는 sscanf_s; 의 와이드 문자 버전이며, swscanf_s 에 대한 인수는 와이드 문자 문자열입니다. sscanf_s는 멀티 바이트 16진수 문자를 처리하지 않습니다. swscanf_s 는 유니코드 전자 16 진수 또는 "호환성 영역" 문자를 처리하지 않습니다. 그렇지 않으면 swscanf_s과 sscanf_s은 동일하게 작동합니다.

_l 접미사가 있는 이러한 함수 버전은 현재 스레드 로캘 대신 전달된 로캘 매개 변수를 사용하는 경우를 제외하고는 동일합니다.

제네릭 텍스트 라우팅 매핑

TCHAR.H 루틴

_UNICODE 및 _MBCS 정의되지 않음

_MBCS 정의됨

_UNICODE 정의됨

_stscanf_s

sscanf_s

sscanf_s

swscanf_s

_stscanf_s_l

_sscanf_s_l

_sscanf_s_l

_swscanf_s_l

요구 사항

루틴

필수 헤더

sscanf_s, _sscanf_s_l

<stdio.h>

swscanf_s, _swscanf_s_l

<stdio.h> 또는 <wchar.h>

호환성에 대한 자세한 내용은 호환성을 참조하십시오.

예제

// crt_sscanf_s.c
// This program uses sscanf_s to read data items
// from a string named tokenstring, then displays them.

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
   char  tokenstring[] = "15 12 14...";
   char  s[81];
   char  c;
   int   i;
   float fp;

   // Input various data from tokenstring:
   // max 80 character string plus NULL terminator
   sscanf_s( tokenstring, "%s", s, _countof(s) );
   sscanf_s( tokenstring, "%c", &c, sizeof(char) );
   sscanf_s( tokenstring, "%d", &i );
   sscanf_s( tokenstring, "%f", &fp );

   // Output the data read
   printf_s( "String    = %s\n", s );
   printf_s( "Character = %c\n", c );
   printf_s( "Integer:  = %d\n", i );
   printf_s( "Real:     = %f\n", fp );
}
  

해당 .NET Framework 항목

Parse 메서드(예: System::Double::Parse)를 참조하십시오.

참고 항목

참조

스트림 I/O

fscanf, _fscanf_l, fwscanf, _fwscanf_l

scanf, _scanf_l, wscanf, _wscanf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

_snprintf, _snprintf_l, _snwprintf, _snwprintf_l