scanf
specyfikacja szerokości
Te informacje dotyczą interpretacji ciągów formatu w scanf
rodzinie funkcji, w tym bezpiecznych wersji, takich jak scanf_s
. Te funkcje zwykle zakładają, że strumień wejściowy jest podzielony na sekwencję tokenów. Tokeny są oddzielone białym znakiem (spacją, kartą lub nowym wierszem) lub typami liczbowymi według naturalnego końca typu danych liczbowych wskazywanego przez pierwszy znak, którego nie można przekonwertować na tekst liczbowy. Jednak specyfikacja szerokości może służyć do analizowania danych wejściowych, aby zatrzymać się przed naturalnym końcem tokenu.
Specyfikacja width
składa się z znaków między specyfikatorem %
pola i typu, który może zawierać dodatnią liczbę całkowitą o nazwie width
pole i co najmniej jeden znak wskazujący rozmiar pola, który może być również uważany za modyfikatory typu pola, takie jak wskazanie, czy typ liczby całkowitej to short
, czy long
. Takie znaki są określane jako prefiks rozmiaru.
width
Pole
Pole width
jest dodatnią liczbą dziesiętną, która kontroluje maksymalną liczbę znaków do odczytania dla tego pola. Nie więcej niż width
znaki są konwertowane i przechowywane w odpowiadającym mu argument
obiekcie . Mniej niż width
znaki mogą być odczytywane, jeśli znak odstępu lub znak, którego nie można przekonwertować zgodnie z danym formatem, występuje przed width
osiągnięciem.
Specyfikacja szerokości jest oddzielona i różni się od argumentu rozmiaru buforu wymaganego przez bezpieczne wersje tych funkcji (na przykład , scanf_s
wscanf_s
i tak dalej). W poniższym przykładzie specyfikacja szerokości wynosi 20, co oznacza, że do 20 znaków należy odczytać ze strumienia wejściowego. Długość buforu wynosi 21, w tym miejsce dla możliwych 20 znaków oraz terminator o wartości null:
char str[21];
scanf_s("%20s", str, 21);
width
Jeśli pole nie jest używane, scanf_s
próbuje odczytać cały token w ciągu. Jeśli określony rozmiar nie jest wystarczająco duży, aby pomieścić cały token, nic nie zostanie zapisane w ciągu docelowym. width
Jeśli pole jest określone, pierwsze width
znaki w tokenie są zapisywane w ciągu docelowym wraz z terminatorem o wartości null.
Prefiks rozmiaru
Opcjonalne prefiksy h
, , l
hh
, ll
I64
, i L
wskazują rozmiar argument
(długi lub krótki, znak jednobajtowy lub szeroki, w zależności od znaku typu, który modyfikują). Te znaki specyfikacji formatu są używane z znakami typu w scanf
systemie lub wscanf
funkcje w celu określenia interpretacji argumentów, jak pokazano w poniższej tabeli. Prefiks I64
typu jest rozszerzeniem firmy Microsoft i nie jest zgodny z standardem C. Znaki typu i ich znaczenie są opisane w tabeli "Znaki typu dla funkcji scanf" w scanf
znakach pól typu.
Uwaga
Prefiksy h
, l
i L
to rozszerzenia firmy Microsoft używane z danymi typu char
.
Prefiksy rozmiaru dla scanf
specyfikatorów typów formatu i wscanf
Aby określić | Użyj prefiksu | Z specyfikatorem typu |
---|---|---|
double |
l |
e , , E , f , g lub G |
long double (takie same jak double ) |
L |
e , , E , f , g lub G |
long int |
l |
d , , i , o , x lub X |
long unsigned int |
l |
u |
long long |
ll |
d , , i , o , x lub X |
short int |
h |
d , , i , o , x lub X |
short unsigned int |
h |
u |
char |
hh |
d , , i , o , x lub X |
unsigned char |
hh |
u |
int64 |
I64 |
d , , i , o , u , x lub X |
Znak jednobajtowy z scanf |
h |
c lub C |
Znak jednobajtowy z wscanf |
h |
c lub C |
Szeroki znak z scanf |
l |
c lub C |
Szeroki znak z wscanf |
l |
Usługa c lub C . |
Ciąg znaków jednobajtowych z scanf |
h |
s lub S |
Ciąg znaków jednobajtowych z wscanf |
h |
s lub S |
Szeroki ciąg znaków z scanf |
l |
s lub S |
Szeroki ciąg znaków z wscanf |
l |
s lub S |
W poniższych przykładach użyto funkcji h
i l
scanf_s
funkcji i wscanf_s
funkcji:
scanf_s("%ls", &x, 2); // Read a wide-character string
wscanf_s(L"%hC", &x, 2); // Read a single-byte character
Jeśli w rodzinie jest używana niezabezpieczona funkcja scanf
, pomiń parametr rozmiaru wskazujący długość buforu poprzedniego argumentu.
Odczytywanie nieelimitowanych ciągów
Aby odczytywać ciągi, które nie są rozdzielane znakami białych znaków, zestaw znaków w nawiasach kwadratowych ([ ]
) może zostać zastąpiony znakiem s
typu (ciąg). Zestaw znaków w nawiasach kwadratowych jest określany jako ciąg kontrolny. Odpowiednie pole wejściowe jest odczytywane do pierwszego znaku, który nie jest wyświetlany w ciągu kontrolki. Jeśli pierwszy znak w zestawie jest karetki (^
), efekt jest odwrócony: pole wejściowe jest odczytywane do pierwszego znaku, który pojawia się w pozostałej części zestawu znaków.
Oba %[a-z]
elementy i %[z-a]
są interpretowane jako równoważne .%[abcde...z]
Jest to typowe scanf
rozszerzenie funkcji, ale nie jest wymagane przez standard C.
Odczytywanie nieokreślonych ciągów
Aby zapisać ciąg bez przechowywania znaku null zakończenia ('\0'), użyj specyfikacji %Nc
, gdzie N jest liczbą całkowitą dziesiętną. W tym przypadku znak typu wskazuje, c
że argument jest wskaźnikiem do tablicy znaków. Następne N znaków są odczytywane ze strumienia wejściowego do określonej lokalizacji, a znak null (\0) nie jest dołączany. Jeśli N nie zostanie określony, jego wartość domyślna to 1.
Po scanf
zatrzymaniu odczytywania pola
Funkcja scanf
skanuje każde pole wejściowe, znak po znaku. Może zatrzymać odczytywanie określonego pola wejściowego, zanim osiągnie znak spacji z jednego z kilku powodów:
Osiągnięto określoną szerokość.
Nie można przekonwertować następnego znaku zgodnie z określonymi.
Następny znak powoduje konflikt z znakiem w ciągu kontrolnym, który ma być zgodny.
Następny znak nie może pojawić się w danym zestawie znaków.
Z jakiegokolwiek powodu, gdy scanf
funkcja przestanie odczytywać pole wejściowe, następne pole wejściowe jest uznawane za rozpoczynające się od pierwszego nieprzeczytanego znaku. Znak powodujący konflikt, jeśli istnieje, jest uznawany za nieprzeczytany. Jest to pierwszy znak następnego pola wejściowego lub pierwszy znak w kolejnych operacjach odczytu na strumieniu wejściowym.
Zobacz też
scanf
, , _scanf_l
, , wscanf
_wscanf_l
scanf_s
, , _scanf_s_l
, , wscanf_s
_wscanf_s_l
Pola specyfikacji formatu: scanf
i wscanf
funkcje
scanf
znaki pola typu