Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Skriver formaterade data till en sträng. Dessa funktioner är versioner av snprintf, _snprintf, _snprintf_l, , _snwprintf_l_snwprintf med säkerhetsförbättringar som beskrivs i Säkerhetsfunktioner i CRT.
Syntax
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
Parameterar
buffer
Lagringsplats för utdata.
sizeOfBuffer
Storleken på lagringsplatsen för utdata. Storlek i byte för de funktioner som tar charoch ord för de som tar wchar_t.
count
Maximalt antal tecken att skriva. För de funktioner som tar wchar_tär det det maximala antalet breda tecken som ska skrivas. Eller _TRUNCATE.
format
Formatkontrollsträng.
argument
Valfria argument.
locale
Språkvarianten som ska användas.
Returvärde
Antalet tecken som skrivs, inklusive avslutande NULL. Ett negativt värde returneras om ett utdatafel inträffar. Mer information finns i Beteendesammanfattning .
Anmärkningar
Funktionen _snprintf_s formaterar och lagrar count eller färre tecken i buffer och lägger till en avslutande NULL. Varje argument (om något) konverteras och utdata enligt motsvarande formatspecifikation i format. Formateringen är konsekvent med funktionsfamiljen printf . Se Formatspecifikationssyntax: printf och wprintf funktioner. Om kopiering sker mellan strängar som överlappar varandra är beteendet odefinierat.
Beteendesammanfattning
För följande tabell:
– Låt oss len vara storleken på de formaterade data. Om funktionen tar en char buffert är storleken i byte. Om funktionen tar en wchar_t buffert anger storleken antalet 16-bitars ord.
- Tecken refererar till
chartecken för funktioner som tar encharbuffert och tillwchar_ttecken för funktioner som tar enwchar_tbuffert. - Mer information om den ogiltiga parameterhanteraren finns i Parameterverifiering.
| Tillstånd | Beteende | Returvärde | errno |
Anropar ogiltig parameterhanterare |
|---|---|---|---|---|
| Framgång | Skriver tecknen till bufferten med den angivna formatsträngen. | Antalet tecken som skrivs, inklusive avslutande NULL. |
Inte tillgänglig | Nej |
| Kodningsfel under formatering | Om du bearbetar strängspecificeraren s, S, eller Z, stoppas bearbetningen av formatspecifikationen. |
-1 |
EILSEQ (42) |
Nej |
| Kodningsfel under formatering | Om bearbetningsteckenspecificeraren c eller C, hoppas det ogiltiga tecknet över. Antalet tecken som skrivs ökas inte för det överhoppade tecknet och inga data skrivs för det. Bearbetningen av formatspecifikationen fortsätter när du har hoppat över specificeraren med kodningsfelet. |
Antalet tecken som skrivs, inklusive avslutande NULL. |
EILSEQ (42) |
Nej |
buffer == NULL och sizeOfBuffer == 0 och count == 0 |
Inga data skrivs. | 0 | Inte tillgänglig | Nej |
buffer == NULL och antingen sizeOfBuffer != 0 eller count != 0 |
Om körningen fortsätter efter att den ogiltiga parameterhanteraren har körts anger errno och returnerar ett negativt värde. |
-1 |
EINVAL (22) |
Ja |
buffer != NULL och sizeOfBuffer == 0 |
Inga data skrivs. | -1 |
EINVAL (22) |
Ja |
count == 0 |
A NULL placeras i början av bufferten. |
-1 | Inte tillgänglig | Nej |
count < 0 |
Osäkert: värdet behandlas som osignerat, vilket sannolikt skapar ett stort värde som resulterar i att minnet som följer bufferten skrivs över. | Antalet tecken som skrivs, inklusive avslutande NULL. |
Inte tillgänglig | Nej |
count < sizeOfBuffer och len <= count |
Alla data skrivs och en avslutande NULL läggs till. |
Antalet tecken som skrivits. | Inte tillgänglig | Nej |
count < sizeOfBuffer och len > count |
De första count tecknen skrivs och en avslutande NULL läggs till. |
-1 | Inte tillgänglig | Nej |
count >= sizeOfBuffer och len < sizeOfBuffer |
Alla data skrivs med en avslutande NULL. |
Antalet tecken som skrivits. | Inte tillgänglig | Nej |
count >= sizeOfBuffer och len >= sizeOfBuffer och count != _TRUNCATE |
Om körningen fortsätter efter att ogiltig parameterhanterare körs, uppsättningar errno, uppsättningar buffer[0] == NULLoch returnerar ett negativt värde. |
-1 |
ERANGE (34) |
Ja |
count == _TRUNCATE och len >= sizeOfBuffer |
Skriver så mycket av strängen som passar in buffer och en avslutande NULL. |
-1 | Inte tillgänglig | Nej |
count == _TRUNCATE och len < sizeOfBuffer |
Skriver hela strängen till buffer med en avslutande NULL. |
Antal tecken skrivna, inklusive avslutande NULL. |
Inte tillgänglig | Nej |
format == NULL |
Inga data skrivs. Om körningen fortsätter efter att den ogiltiga parameterhanteraren har körts anger errno och returnerar ett negativt värde. |
-1 |
EINVAL (22) |
Ja |
Information om dessa och andra felkoder finns i _doserrno, errno, _sys_errlistoch _sys_nerr.
Viktigt!
Kontrollera att det format inte är en användardefinierad sträng.
Från och med Windows 10 version 2004 (version 19041) skriver funktionsfamiljen printf ut exakt representerande flyttalsnummer enligt IEEE 754-reglerna för avrundning. I tidigare versioner av Windows skulle exakt representerande flyttalsnummer som slutar på "5" alltid avrunda uppåt. IEEE 754 anger att de måste avrunda till den närmaste jämna siffran (även kallat "Bankers avrundning"). Till exempel bör både printf("%1.0f", 1.5) och printf("%1.0f", 2.5) avrunda till 2. Tidigare skulle 1,5 avrunda till 2 och 2,5 skulle avrunda till 3. Den här ändringen påverkar endast exakt representerande tal. Till exempel fortsätter 2.35 (som, när det representeras i minnet, är närmare 2.3500000000000000008) att avrunda upp till 2,4. Avrundning som utförs av dessa funktioner respekterar nu också flyttalsrundningsläget som anges av fesetround. Tidigare valde FE_TONEAREST avrundning alltid beteende. Den här ändringen påverkar endast program som skapats med Visual Studio 2019 version 16.2 och senare. Om du vill använda det äldre avrundningsbeteendet för flyttalser länkar du till legacy_stdio_float_rounding.obj.
_snwprintf_s är en bred teckenversion av _snprintf_s; pekarargumenten till _snwprintf_s är breda teckensträngar. Identifiering av kodningsfel i _snwprintf_s kan skilja sig från i _snprintf_s.
_snwprintf_s
swprintf_sskriver utdata till en sträng i stället för till ett mål av typen FILE.
Versionerna av dessa funktioner med suffixet _l är identiska, förutom att de använder parametern locale som skickas i stället för den aktuella trådspråkinställningen.
I C++ förenklas användningen av dessa funktioner av överbelastningar av mallar; Överlagringarna kan härleda buffertlängden automatiskt (vilket eliminerar behovet av att ange ett storleksargument) och de kan automatiskt ersätta äldre, icke-säkra funktioner med sina nyare, säkra motsvarigheter. För mer information, se Secure template overloads.
Allmän textrutinmappning
Tchar.h rutin |
_UNICODE och _MBCS inte definierad |
_MBCS definierad |
_UNICODE definierad |
|---|---|---|---|
_sntprintf_s |
_snprintf_s |
_snprintf_s |
_snwprintf_s |
_sntprintf_s_l |
_snprintf_s_l |
_snprintf_s_l |
_snwprintf_s_l |
Kravspecifikation
| Rutin | Obligatoriskt huvud |
|---|---|
_snprintf_s, _snprintf_s_l |
<stdio.h> |
_snwprintf_s, _snwprintf_s_l |
<stdio.h> eller <wchar.h> |
Mer kompatibilitetsinformation finns i Kompatibilitet.
Exempel
// 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, size_t count )
{
char dest[10];
printf( "\n" );
if ( count == _TRUNCATE )
printf( "%zd-byte buffer; truncation semantics\n",
_countof(dest) );
else
printf( "count = %zd; %zd-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();
}
count = 8; 10-byte buffer
new contents of dest: '<<<121>>'
count = 9; 10-byte buffer
new contents of dest: '<<<121>>>'
count = 10; 10-byte buffer
new contents of dest: '<<<121>>>'
Destination buffer too small:
count = 10; 10-byte buffer
Invalid parameter handler invoked: ("Buffer too small", 0)
new contents of dest: ''
Truncation examples:
10-byte buffer; truncation semantics
new contents of dest: '<<<1221>>'
truncation did occur
10-byte buffer; truncation semantics
new contents of dest: '<<<121>>>'
truncation did not occur
Secure template overload example:
Invalid parameter handler invoked: ("Buffer too small", 0)
new contents of dest: ''
Se även
Strömma 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 funktioner