scanf
specifikace šířky
Tyto informace platí pro interpretaci formátových řetězců ve scanf
skupině funkcí, včetně zabezpečených verzí, jako scanf_s
je . Tyto funkce obvykle předpokládají, že vstupní datový proud je rozdělený do posloupnosti tokenů. Tokeny jsou oddělené prázdnými znaky (mezera, tabulátor nebo nový řádek) nebo pro číselné typy přirozeným koncem číselného datového typu, jak je uvedeno prvním znakem, který nelze převést na číselný text. Specifikace šířky však může být použita k analýze vstupu, která se zastaví před přirozeným koncem tokenu.
Specifikace width
se skládá ze znaků mezi %
specifikátorem pole typu, který může obsahovat kladné celé číslo označované jako width
pole a jeden nebo více znaků označující velikost pole, které mohou být také považovány za modifikátory typu pole, například označení, zda je short
typ celého čísla nebo long
. Takové znaky se označují jako předpona velikosti.
Pole width
Pole width
je kladné desetinné číslo, které určuje maximální počet znaků, které se mají pro toto pole přečíst. Nepřevedou se více než width
znaky a uloží se do odpovídajících argument
znaků . Méně znaků width
může být přečteno, pokud je width
dosaženo prázdného znaku nebo znaku, který nelze převést v souladu s daným formátem.
Specifikace šířky je oddělená a odlišná od argumentu velikosti vyrovnávací paměti vyžadovaného zabezpečenými verzemi těchto funkcí (například scanf_s
, atd wscanf_s
.). V následujícím příkladu je specifikace šířky 20, což znamená, že z vstupního datového proudu se má číst až 20 znaků. Délka vyrovnávací paměti je 21, což zahrnuje prostor pro možné 20 znaků plus ukončovací znak null:
char str[21];
scanf_s("%20s", str, 21);
width
Pokud se pole nepoužívá, scanf_s
pokusí se do řetězce přečíst celý token. Pokud zadaná velikost není dostatečně velká pro uložení celého tokenu, nic se nezapíše do cílového řetězce. width
Pokud je pole zadáno, první width
znaky v tokenu se zapíšou do cílového řetězce spolu s ukončovacím znakem null.
Předpona velikosti
Volitelné předpony h
, , hh
, ll
l
, I64
a L
indikují velikost argument
(dlouhý nebo krátký znak s jedním bajtem nebo široký znak v závislosti na znaku typu, který upravují). Tyto znaky specifikace formátu se používají se znaky typu nebo scanf
wscanf
funkce k určení interpretace argumentů, jak je znázorněno v následující tabulce. Předpona I64
typu je rozšíření Microsoftu a není kompatibilní se standardem C. Znaky typu a jejich významy jsou popsány v tabulce "Typ znaků pro funkce scanf" v scanf
znaky pole typu.
Poznámka:
, h
l
a L
předpony jsou microsoft rozšíření při použití s daty typu char
.
Předpony velikosti specifikátorů a scanf
wscanf
specifikátorů formátu
Určení | Použít předponu | Se specifikátorem typu |
---|---|---|
double |
l |
e , E , f , g nebo G |
long double (stejné jako double ) |
L |
e , E , f , g nebo G |
long int |
l |
d , i , o , x nebo X |
long unsigned int |
l |
u |
long long |
ll |
d , i , o , x nebo X |
short int |
h |
d , i , o , x nebo X |
short unsigned int |
h |
u |
char |
hh |
d , i , o , x nebo X |
unsigned char |
hh |
u |
int64 |
I64 |
d , i , o , u , , x nebo X |
Jednobajtů s jedním bajtovým znakem scanf |
h |
c nebo C |
Jednobajtů s jedním bajtovým znakem wscanf |
h |
c nebo C |
Široký znak s scanf |
l |
c nebo C |
Široký znak s wscanf |
l |
c , nebo C |
Řetězec jednobajtů s jedním bajtem scanf |
h |
s nebo S |
Řetězec jednobajtů s jedním bajtem wscanf |
h |
s nebo S |
Široký znakový řetězec s scanf |
l |
s nebo S |
Široký znakový řetězec s wscanf |
l |
s nebo S |
Následující příklady používají h
a l
používají scanf_s
funkce a wscanf_s
funkce:
scanf_s("%ls", &x, 2); // Read a wide-character string
wscanf_s(L"%hC", &x, 2); // Read a single-byte character
Pokud v rodině scanf
použijete nezabezpečenou funkci, vynecháte parametr velikost označující délku vyrovnávací paměti předchozího argumentu.
Čtení nedelikovaných řetězců
Chcete-li číst řetězce, které nejsou oddělené prázdnými znaky, lze sadu znaků v hranatých závorkách ([ ]
) nahradit znakem s
typu (řetězec). Sada znaků v hranatých závorkách se označuje jako řídicí řetězec. Odpovídající vstupní pole se načte až do prvního znaku, který se nezobrazuje v ovládacím řetězci. Pokud je první znak v sadě stříškou (^
) efekt obrácený: Vstupní pole se přečte až do prvního znaku, který se zobrazí ve zbytku znakové sady.
Oba %[a-z]
a %[z-a]
jsou interpretovány jako ekvivalentní %[abcde...z]
. Jedná se o běžné scanf
rozšíření funkcí, které ale standard C nevyžaduje.
Čtení neukončených řetězců
Pokud chcete řetězec uložit bez uložení koncového znaku null (\0), použijte specifikaci %Nc
, kde N je desetinné celé číslo. V tomto případě znak typu označuje, c
že argument je ukazatel na pole znaků. Další N znaky se načtou ze vstupního datového proudu do zadaného umístění a nepřidají se žádné znaky null (\0). Pokud není zadaná hodnota N , její výchozí hodnota je 1.
Když scanf
přestane číst pole
Funkce scanf
prohledá každé vstupní pole, znak podle znaku. Může přestat číst konkrétní vstupní pole, než dosáhne znaku mezery z několika důvodů:
Byla dosažena zadaná šířka.
Další znak nelze převést, jak je zadáno.
Další znak je v konfliktu s znakem v ovládacím řetězci, který má odpovídat.
Další znak se v dané znakové sadě nezobrazí.
Z jakéhokoli důvodu, když scanf
funkce přestane číst vstupní pole, další vstupní pole se považuje za začátek prvního nepřečteného znaku. Konfliktní znak, pokud existuje, je považován za nepřečtený. Jedná se o první znak dalšího vstupního pole nebo první znak v následných operacích čtení vstupního datového proudu.
Viz také
scanf
, _scanf_l
, , wscanf
_wscanf_l
scanf_s
, _scanf_s_l
, , wscanf_s
_wscanf_s_l
Pole specifikace formátu: scanf
a wscanf
funkce
scanf
Znaky pole typu