sscanf_s
, _sscanf_s_l
, , swscanf_s
_swscanf_s_l
Čte formátovaná data z řetězce. Tyto verze sscanf
, , _sscanf_l
_swscanf_l
swscanf
mají vylepšení zabezpečení, jak je popsáno v funkcích zabezpečení v CRT.
Syntaxe
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 ] ...
);
Parametry
buffer
Uložená data
format
Řetězec řízení formátu Další informace naleznete v tématu Pole specifikace formátu: scanf
a wscanf
funkce.
argument
Volitelné argumenty
locale
Národní prostředí, které se má použít
Vrácená hodnota
Každá z těchto funkcí vrátí počet polí, která jsou úspěšně převedena a přiřazena. Vrácená hodnota neobsahuje pole, která byla přečtená, ale nepřiřazená. Vrácená hodnota 0 označuje, že nebyla přiřazena žádná pole. Vrácená hodnota je EOF
pro chybu nebo pokud je dosaženo konce řetězce před prvním převodem.
Pokud buffer
nebo format
je NULL
ukazatel, vyvolá se neplatná obslužná rutina parametru, jak je popsáno v ověření parametru. Pokud je provádění povoleno pokračovat, vrátí tyto funkce hodnotu -1 a nastaví errno
se na EINVAL
Informace o těchto a dalších kódech chyb naleznete v tématu , , , a_sys_nerr
. _sys_errlist
_doserrno
errno
Poznámky
Funkce sscanf_s
čte data z buffer
umístění, které každý z nich argument
dává . Argumenty za formátovací řetězec určují ukazatele na proměnné, které mají typ, který odpovídá specifikátoru typu v format
. Na rozdíl od méně zabezpečené verze sscanf
se vyžaduje parametr velikosti vyrovnávací paměti při použití znaků c
pole typu , C
, s
, S
, nebo sad ovládacích prvků řetězců, které jsou uzavřeny .[]
Velikost vyrovnávací paměti ve znaky musí být zadána jako dodatečný parametr bezprostředně za každým parametrem vyrovnávací paměti, který ho vyžaduje. Pokud například čtete řetězec, předá se velikost vyrovnávací paměti pro tento řetězec následujícím způsobem:
wchar_t ws[10];
swscanf_s(in_str, L"%9s", ws, (unsigned)_countof(ws)); // buffer size is 10, width specification is 9
Velikost vyrovnávací paměti zahrnuje koncovou hodnotu null. Pole specifikace šířky lze použít k zajištění toho, aby se token, který je přečtený, vešl do vyrovnávací paměti. Pokud se nepoužije žádné pole specifikace šířky a čtení tokenu je příliš velké, aby se vešlo do vyrovnávací paměti, nic se do této vyrovnávací paměti nezapíše.
Jeden znak může být přečtený takto:
wchar_t wc;
swscanf_s(in_str, L"%c", &wc, 1);
Tento příklad načte jeden znak ze vstupního řetězce a uloží ho do vyrovnávací paměti širokého znaku. Při čtení více znaků pro nenulové ukončené řetězce se jako specifikace šířky a velikosti vyrovnávací paměti použijí celá čísla bez znaménka.
char c[4];
sscanf_s(input, "%4c", &c, (unsigned)_countof(c)); // not null terminated
Další informace naleznete v tématu scanf_s
, _scanf_s_l
, wscanf_s
_wscanf_s_l
a scanf
zadejte znaky pole.
Poznámka:
Parametr velikosti je typu unsigned
, nikoli size_t
. Při kompilaci pro 64bitové cíle použijte statické přetypování a převeďte _countof
sizeof
výsledky na správnou velikost.
Argument format
řídí interpretaci vstupních polí a má stejný tvar a funkci jako format
argument funkce scanf_s
. Pokud ke kopírování dojde mezi řetězci, které se překrývají, chování není definováno.
swscanf_s
je verze širokého znaku sscanf_s
; argumenty, které mají swscanf_s
být řetězce širokého znaku. sscanf_s
nezpracuje vícebajtové šestnáctkové znaky. swscanf_s
nezpracuje šestnáctkové znaky unicode s plnou šířkou nebo "zónou kompatibility". swscanf_s
V opačném případě se sscanf_s
chovejte stejně.
Verze těchto funkcí, které mají příponu _l
, jsou shodné s tím rozdílem, že používají parametr národního prostředí předaný místo aktuálního národního prostředí vlákna.
Mapování rutin obecného textu
TCHAR.H rutina |
_UNICODE a _MBCS není definován |
_MBCS definovaný |
_UNICODE definovaný |
---|---|---|---|
_stscanf_s |
sscanf_s |
sscanf_s |
swscanf_s |
_stscanf_s_l |
_sscanf_s_l |
_sscanf_s_l |
_swscanf_s_l |
Požadavky
Rutina | Požadovaný hlavičkový soubor |
---|---|
sscanf_s , _sscanf_s_l |
<stdio.h> |
swscanf_s , _swscanf_s_l |
<stdio.h> nebo <wchar.h> |
Další informace o kompatibilitě najdete v tématu Kompatibilita.
Příklad
// 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, (unsigned)_countof(s) );
sscanf_s( tokenstring, "%c", &c, (unsigned)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 );
}
String = 15
Character = 1
Integer: = 15
Real: = 15.000000
Viz také
Vstupně-výstupní operace streamu
fscanf
, _fscanf_l
, , fwscanf
_fwscanf_l
scanf
, _scanf_l
, , wscanf
_wscanf_l
sprintf
, _sprintf_l
, swprintf
, , _swprintf_l
__swprintf_l
snprintf
, _snprintf
, _snprintf_l
, , _snwprintf
_snwprintf_l