Udostępnij przez


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 argumentobiekcie . 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_swscanf_si 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, , lhh, llI64, 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, li 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, glub G
long double (takie same jak double) L e, , E, f, glub G
long int l d, , i, o, xlub X
long unsigned int l u
long long ll d, , i, o, xlub X
short int h d, , i, o, xlub X
short unsigned int h u
char hh d, , i, o, xlub X
unsigned char hh u
int64 I64 d, , i, o, u, xlub 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 lscanf_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