다음을 통해 공유


_snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l

문자열에 서식이 지정된 데이터를 씁니다. CRT의 보안 기능에 설명된 대로 보안 향상 기능이 포함된 _snprintf, _snprintf_l, _snwprintf, _snwprintf_l 버전입니다.

int _snprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format [,
   argument] ... 
);
int _snprintf_s_l(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format,
   locale_t locale [,
   argument] ... 
);
int _snwprintf_s(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const wchar_t *format [,
   argument] ... 
);
int _snwprintf_s_l(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const wchar_t *format,
   locale_t locale [,
   argument] ... 
);
template <size_t size>
int _snprintf_s(
   char (&buffer)[size],
   size_t count,
   const char *format [,
   argument] ... 
); // C++ only
template <size_t size>
int _snwprintf_s(
   wchar_t (&buffer)[size],
   size_t count,
   const wchar_t *format [,
   argument] ... 
); // C++ only

매개 변수

  • buffer
    출력을 위한 저장소 위치

  • sizeOfBuffer
    출력을 위한 저장소 위치의 크기입니다. _snprintf_s을 위한 bytes의 사이즈 또는 _snwprintf_s을 위한 words의 사이즈.

  • Count
    저장할 최대 문자 수 또는 _TRUNCATE

  • format
    형식 컨트롤 문자열입니다.

  • argument
    선택적 인수입니다.

  • locale
    사용할 로캘입니다.

반환 값

_snprintf_s는 종료된 널 문자를 제외하고 buffer에 저장된 문자 수를 반환합니다. _snwprintf_s는 종료 null 와이드 문자를 제외하고 buffer에 저장된 와이드 문자 수를 반환합니다.

데이터를 저장하고 널을 종료할 것이 요구된 저장소가 sizeOfBuffer를 초과한 경우, 잘못된 매개 변수 처리기가 매개 변수 유효성 검사에 설명된 대로 호출됩니다. 잘못된 매개 변수 처리기 이후에 실행이 계속되는 경우 이러한 함수는 buffer 은 빈 문자열로 설정하고 errno 를 ERANGE로 설정하고 -1을 반환합니다.

만약 buffer 또는 format 가 NULL 포인터인 경우 또는 count 가 0보다 작거나 같은 값인 경우 잘못된 매개 변수 처리기가 호출됩니다. 계속해서 실행하도록 허용된 경우, 이러한 함수는 errno를 EINVAL 로 설정하고 -1을 반환합니다.

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

설명

_snprintf_s 함수 형식은 count 혹은 buffer보다 적은 문자를 저장하고 종료 널을 덧붙입니다. 각 인수(있는 경우)는 format의 해당 형식 사양에 따라 변환되어 출력됩니다. 이 형식은 printf 함수군과 일치합니다. 형식 사양 구문: printf 및 wprintf 함수를 보세요. 중복되는 문자열 간에 복사가 이뤄지면 이 동작은 정의되지 않습니다.

count가 _TRUNCATE이면, _snprintf_s은 종료 널의 공간을 남기고 buffer에 맞는 가능한 한 최대의 문자열을 씁니다. 전체 문자열(종료 null 포함)이 buffer에 맞는 경우, _snprintf_s는 작성된 (종료 null 포함하지 않음) 문자의 수를 반환합니다. 그렇지 않으면 _snprintf_s은 -1을 출력하여 잘리는 현상이 표시 되었음을 알립니다.

보안 정보보안 정보

format이 사용자 정의 문자열이 아닌지 확인하십시오.

_snwprintf_s는 _snprintf_s의 와이드 문자 버전이며, _snwprintf_s에 대한 포인터 인수는 와이드 문자 문자열입니다. _snwprintf_s에서 인코딩 오류의 탐지 방식은 _snprintf_s와 다를 수 있습니다. swprintf_s와 같은 _snwprintf_s는 형식FILE의 목적지보다는 문자열로 출력합니다.

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

C++에서는 템플릿 오버로드로 인해 이러한 함수를 사용하는 것이 보다 간단해 집니다. 오버로드는 버퍼 길이를 자동으로 유추할 수 있으며(크기 인수를 지정할 필요가 없어짐), 기존의 비보안 함수를 보다 최신의 보안 대응 함수로 자동으로 바꿀 수 있습니다. 자세한 내용은 안전한 템플릿 오버로드을 참조하십시오.

제네릭 텍스트 라우팅 매핑

Tchar.h 루틴

_UNICODE 및 _MBCS 정의되지 않음

_MBCS 정의됨

_UNICODE 정의됨

_sntprintf_s

_snprintf_s

_snprintf_s

_snwprintf_s

_sntprintf_s_l

_snprintf_s_l

_snprintf_s_l

_snwprintf_s_l

요구 사항

루틴

필수 헤더

_snprintf_s, _snprintf_s_l

<stdio.h>

_snwprintf_s, _snwprintf_s_l

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

호환성에 대한 자세한 내용은 소개 단원의 호환성 부분을 참조하십시오.

예제

// crt_snprintf_s.cpp
// compile with: /MTd

// These #defines enable secure template overloads
// (see last part of Examples() below)
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <crtdbg.h>  // For _CrtSetReportMode
#include <errno.h>

// This example uses a 10-byte destination buffer.

int snprintf_s_tester( const char * fmt, int x, int count )
{
   char dest[10];

   printf( "\n" );

   if ( count == _TRUNCATE )
      printf( "%d-byte buffer; truncation semantics\n",
               _countof(dest) );
   else
      printf( "count = %d; %d-byte buffer\n",
               count, _countof(dest) );

   int ret = _snprintf_s( dest, _countof(dest), count, fmt, x );

   printf( "    new contents of dest: '%s'\n", dest );

   return ret;
}


void Examples()
{
   // formatted output string is 9 characters long: "<<<123>>>"
   snprintf_s_tester( "<<<%d>>>", 121, 8 );
   snprintf_s_tester( "<<<%d>>>", 121, 9 );
   snprintf_s_tester( "<<<%d>>>", 121, 10 );

   printf( "\nDestination buffer too small:\n" );

   snprintf_s_tester( "<<<%d>>>", 1221, 10 );

   printf( "\nTruncation examples:\n" );

   int ret = snprintf_s_tester( "<<<%d>>>", 1221, _TRUNCATE );
   printf( "    truncation %s occur\n", ret == -1 ? "did"
                                                  : "did not" );

   ret = snprintf_s_tester( "<<<%d>>>", 121, _TRUNCATE );
   printf( "    truncation %s occur\n", ret == -1 ? "did"
                                                  : "did not" );
   printf( "\nSecure template overload example:\n" );

   char dest[10];
   _snprintf( dest, 10, "<<<%d>>>", 12321 );
   // With secure template overloads enabled (see #defines
   // at top of file), the preceding line is replaced by
   //    _snprintf_s( dest, _countof(dest), 10, "<<<%d>>>", 12345 );
   // Instead of causing a buffer overrun, _snprintf_s invokes
   // the invalid parameter handler.
   // If secure template overloads were disabled, _snprintf would
   // write 10 characters and overrun the dest buffer.
   printf( "    new contents of dest: '%s'\n", dest );
}

void myInvalidParameterHandler(
   const wchar_t* expression,
   const wchar_t* function, 
   const wchar_t* file, 
   unsigned int line, 
   uintptr_t pReserved)
{
   wprintf(L"Invalid parameter handler invoked: %s\n", expression);
}

int main( void )
{
   _invalid_parameter_handler oldHandler, newHandler;

   newHandler = myInvalidParameterHandler;
   oldHandler = _set_invalid_parameter_handler(newHandler);
   // Disable the message box for assertions.
   _CrtSetReportMode(_CRT_ASSERT, 0);

   Examples();
}
  

해당 .NET Framework 항목

해당 사항 없음. 표준 C 함수를 호출하려면 PInvoke를 사용합니다. 자세한 내용은 플랫폼 호출 예제를 참조하십시오.

참고 항목

참조

스트림 I/O

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

scanf, _scanf_l, wscanf, _wscanf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

vprintf 함수