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 ] ...
);
매개 변수
buffer
저장된 데이터format
형식 컨트롤 문자열입니다. 자세한 내용은 형식 사양 필드: scanf 및 wscanf 함수을 참조하십시오.argument
선택적 인수locale
사용할 로캘입니다.
반환 값
해당 함수는 각각 성공적으로 변환, 배정된 필드 수를 반환합니다. 이때 읽기는 되었지만 지정되지 않은 필드는 반환 값에 포함되지 않습니다. 반환 값 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_l 및 scanf 형식 필드 문자를 참조하십시오.
참고
이 크기 매개 변수는 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)를 참조하십시오.
참고 항목
참조
fscanf, _fscanf_l, fwscanf, _fwscanf_l
scanf, _scanf_l, wscanf, _wscanf_l