Sdílet prostřednictvím


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_lwscanfmají 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_doserrnoerrno

Poznámky

Funkce scanf_s čte data ze standardního vstupního datového proudu stdina 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_sje verze širokého znaku scanf_sformat ; 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 wscanfscanf_s a wscanf_s vyžadovat, abyste pro některé parametry zadali velikosti vyrovnávací paměti. Zadejte velikosti pro všechny cparametry sady [] ovládacích prvků , , CsS, 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 Rutinní _UNICODE a _MBCS není definován _MBCS Definovány _UNICODE Definovány
_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ů stdinstdouta 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