scanf_s
, _scanf_s_l
, , wscanf_s
_wscanf_s_l
Čte formátovaná data ze standardního vstupního datového proudu. Tyto verze scanf
, , _scanf_l
_wscanf_l
wscanf
mají vylepšení zabezpečení, jak je popsáno v funkcích zabezpečení v CRT.
Syntaxe
int scanf_s(
const char *format [,
argument]...
);
int _scanf_s_l(
const char *format,
_locale_t locale [,
argument]...
);
int wscanf_s(
const wchar_t *format [,
argument]...
);
int _wscanf_s_l(
const wchar_t *format,
_locale_t locale [,
argument]...
);
Parametry
format
Formátovací řetězec ovládacího prvku
argument
Volitelné argumenty
locale
Národní prostředí, které se má použít
Vrácená hodnota
Vrátí počet polí úspěšně převedených a přiřazených. 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. Návratová hodnota je chybná nebo pokud se EOF
v prvním pokusu o načtení znaku nachází znak konce souboru nebo znak konce řetězce. Pokud format
je NULL
ukazatel, je vyvolána neplatná obslužná rutina parametru, jak je popsáno v ověření parametru. Pokud je povoleno pokračovat scanf_s
provádění a wscanf_s
vrátit EOF
a nastavit errno
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 scanf_s
čte data ze standardního vstupního datového proudu stdin
a zapisuje je do argument
. Každý argument
musí být ukazatel na typ proměnné, který odpovídá specifikátoru typu v format
. Pokud ke kopírování dojde mezi řetězci, které se překrývají, chování není definováno.
wscanf_s
je verze širokého znaku scanf_s
format
; argument je wscanf_s
řetězec širokého znaku. wscanf_s
a scanf_s
chovejte se stejně, pokud je datový proud otevřen v režimu ANSI. scanf_s
v současné době nepodporuje vstup z datového proudu UNICODE.
Verze těchto funkcí, které mají příponu _l
, jsou stejné, s výjimkou toho, že používají locale
parametr místo aktuálního národního prostředí vlákna.
Na rozdíl od scanf
a wscanf
scanf_s
a wscanf_s
vyžadovat, abyste pro některé parametry zadali velikosti vyrovnávací paměti. Zadejte velikosti pro všechny c
parametry sady []
ovládacích prvků , , C
s
S
, nebo řetězců. Velikost vyrovnávací paměti ve znaky se předává jako jiný parametr. Okamžitě následuje ukazatel na vyrovnávací paměť nebo proměnnou. Pokud například čtete řetězec, předá se velikost vyrovnávací paměti pro tento řetězec následujícím způsobem:
char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9
Velikost vyrovnávací paměti zahrnuje terminál s hodnotou null. Pole specifikace šířky můžete použít k zajištění toho, aby se token, který je přečtený, vešl do vyrovnávací paměti. Pokud je token příliš velký, aby se vešl, nic se nezapíše do vyrovnávací paměti, pokud není specifikace šířky.
Poznámka:
Parametr velikosti je typu unsigned
, nikoli size_t
. Pomocí statického size_t
přetypování můžete převést hodnotu na unsigned
64bitové konfigurace sestavení.
Parametr velikosti vyrovnávací paměti popisuje maximální počet znaků, nikoli bajty. V tomto příkladu šířka typu vyrovnávací paměti neodpovídá šířce specifikátoru formátu.
wchar_t ws[10];
wscanf_s(L"%9S", ws, (unsigned)_countof(ws));
Specifikátor S
formátu znamená použití šířky znaků, která je "opačná" výchozí šířka podporovaná funkcí. Šířka znaku je jeden bajt, ale funkce podporuje dvojité bajtové znaky. Tento příklad čte v řetězci až devět jednobajtových znaků a umístí je do vyrovnávací paměti dvoubajtových znaků. Znaky jsou považovány za hodnoty s jedním bajtem; první dva znaky jsou uloženy v ws[0]
, druhý dva jsou uloženy v ws[1]
a tak dále.
Tento příklad čte jeden znak:
char c;
scanf_s("%c", &c, 1);
Pokud se přečte více znaků pro řetězce, které nejsou ukončeny hodnotou null, používají se celá čísla pro specifikaci šířky i velikost vyrovnávací paměti.
char c[4];
scanf_s("%4c", c, (unsigned)_countof(c)); // not null terminated
Další informace naleznete v tématu scanf
Specifikace šířky.
Mapování rutin obecného textu
TCHAR.H rutina |
_UNICODE a _MBCS není definován |
_MBCS definovaný |
_UNICODE definovaný |
---|---|---|---|
_tscanf_s |
scanf_s |
scanf_s |
wscanf_s |
_tscanf_s_l |
_scanf_s_l |
_scanf_s_l |
_wscanf_s_l |
Další informace naleznete v tématu Pole specifikace formátu: scanf
a wscanf
funkce.
Požadavky
Rutina | Požadovaný hlavičkový soubor |
---|---|
scanf_s , _scanf_s_l |
<stdio.h> |
wscanf_s , _wscanf_s_l |
<stdio.h> nebo <wchar.h> |
Konzola není podporována v aplikacích pro Univerzální platforma Windows (UPW). Standardní zpracování datových proudů stdin
stdout
a stderr
musí být přesměrován před tím, než je funkce běhu jazyka C mohou používat v aplikacích pro UPW. Další informace o kompatibilitě najdete v tématu Kompatibilita.
Příklad
// crt_scanf_s.c
// This program uses the scanf_s and wscanf_s functions
// to read formatted input.
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
int i,
result;
float fp;
char c,
s[80];
wchar_t wc,
ws[80];
result = scanf_s( "%d %f %c %C %s %S", &i, &fp, &c, 1,
&wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_countof(ws) );
printf( "The number of fields input is %d\n", result );
printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c,
wc, s, ws);
result = wscanf_s( L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,
&wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_countof(ws) );
wprintf( L"The number of fields input is %d\n", result );
wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp,
c, wc, s, ws);
}
Tento program při zadání tohoto vstupu vytvoří následující výstup:
71 98.6 h z Byte characters
36 92.3 y n Wide characters
The number of fields input is 6
The contents are: 71 98.599998 h z Byte characters
The number of fields input is 6
The contents are: 36 92.300003 y n Wide characters
Viz také
Podpora pro matematiku a plovoucí desetinou čárku
Vstupně-výstupní operace streamu
Národní prostředí
fscanf
, _fscanf_l
, , fwscanf
_fwscanf_l
printf
, _printf_l
, , wprintf
_wprintf_l
sprintf
, _sprintf_l
, swprintf
, , _swprintf_l
__swprintf_l
sscanf
, _sscanf_l
, , swscanf
_swscanf_l