Sdílet prostřednictvím


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_sje . 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 argumentznaků . 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, lll, I64a 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 scanfwscanf 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

, hla L předpony jsou microsoft rozšíření při použití s daty typu char.

Předpony velikosti specifikátorů a scanfwscanf specifikátorů formátu

Určení Použít předponu Se specifikátorem typu
double l e, E, f, gnebo G
long double (stejné jako double) L e, E, f, gnebo G
long int l d, i, o, xnebo X
long unsigned int l u
long long ll d, i, o, xnebo X
short int h d, i, o, xnebo X
short unsigned int h u
char hh d, i, o, xnebo X
unsigned char hh u
int64 I64 d, i, o, u, , xnebo 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