scanf — Specyfikacje szerokości
Te informacje dotyczą interpretacji ciągi formatów w scanf rodziny funkcji, w tym bezpiecznej wersji, takie jak scanf_s.Funkcje te normalnie zakładać, że strumień wejściowy jest podzielony na sekwencję tokenów.Tokeny są oddzielone przez światła (miejsce, kartę lub nowego wiersza) lub w odniesieniu do typów liczbowych, do końca naturalne typ danych numerycznych, zgodnie ze wskazaniami pierwszego znaku, który nie może być konwertowane na tekst numeryczny.Jednakże szerokość specyfikacji można wykorzystać do powodować podczas analizowania danych wejściowych do zatrzymać przed zakończeniem naturalne tokenu.
Szerokość specyfikacji składa się ze znaków między % i specyfikatora typu pola, które mogą obejmować dodatnią liczbą całkowitą o nazwie Szerokość pola i jeden lub więcej znaków, rozmiar pola, które mogą być również uwzględnione jako modyfikatory typu pola, takie jak wskazanie czy jest typu Liczba całkowita Krótki lub długi.Znaki te są określane jako prefiks rozmiaru.
Szerokość pola
Szerokość pole jest całkowitą liczbą dodatnią dziesiętny sterowanie maksymalną liczbę znaków do odczytu dla tego pola.Nie więcej niż Szerokość znaki są konwertowane i przechowywane w odpowiednich argument.Mniej niż Szerokość znaków może być przeczytać, jeśli znak spacji (miejsce, kartę lub nowego wiersza) lub znak, który nie może zostać przekonwertowany zgodnie z określonym formatem występuje przed Szerokość zostanie osiągnięty.
Specyfikacja szerokość jest odrębne i niezależne od argumentu rozmiar buforu wymagany przez bezpieczne wersje tych funkcji (czyli, scanf_s, wscanf_s, itp.). W poniższym przykładzie, specyfikacja szerokość wynosi 20, co oznacza, że maksymalnie 20 znaków mają być odczytane z strumień wejściowy.Długość buforu jest 21, który obejmuje miejsce na możliwe 20 znaków plus null terminator:
char str[21];
scanf_s("%20s", str, 21);
Jeśli Szerokość pole nie jest używane, scanf_s spróbuje odczytać całego token w ciągu.Jeśli określony rozmiar nie jest wystarczająco duży, aby pomieścić całą token, nic nie zostaje zapisany na ciąg docelowy.Jeśli Szerokość pole jest określony, następnie pierwszy Szerokość znaków w tokenie będą zapisywane na ciąg docelowy wzdłuż z zerową terminator.
Prefiks rozmiaru
Opcjonalne prefiksy h, l, ll, I64, i L wskazuje rozmiar argument (długiej lub krótkiej, znaków jednobajtowych lub znak dwubajtowy, w zależności od typu znak, który oni modyfikować).Te znaki specyfikacja formatu są używane z typu znaków w scanf lub wscanf funkcje, aby określić interpretacji argumenty, jak pokazano w poniższej tabeli.Prefiks typu I64 jest rozszerzenie Microsoft i nie jest ANSI zgodny.Wpisz znaki i ich znaczenie są opisane w tabeli "Wpisz znaki dla funkcji scanf" w scanf — Znaki pola typu.
[!UWAGA]
h, g, i L prefiksy są rozszerzenia Microsoft używanego z systemami dane typu char.
Rozmiar prefiksów dla scanf i wscanf specyfikatory typ formatu
Aby określić |
Użyj prefiksu |
Ze specyfikatorem typu |
---|---|---|
double |
l |
e, E, f, g, or G |
Długa podwójna (taki sam jak podwójne) |
L |
e, E, f, g, or G |
int długie |
l |
d, i, o, x, or X |
int długa bez znaku |
l |
u |
Typ long long |
LL |
d, i, o, x, or X |
short int |
h |
d, i, o, x, or X |
krótki int bez znaku |
h |
u |
__int64 |
I64 |
d, i, o, u, x, or X |
Znaków jednobajtowych zscanf |
h |
c or C |
Znaków jednobajtowych zwscanf |
h |
c or C |
Znak dwubajtowy zscanf |
l |
c or C |
Znak dwubajtowy zwscanf |
l |
c, or C |
Jednobajtowe — ciąg znaków zscanf |
h |
s or S |
Jednobajtowe — ciąg znaków zwscanf |
h |
s or S |
Ciąg znaków Widescanf |
l |
s or S |
Ciąg znaków Widewscanf |
l |
s or S |
W poniższych przykładach użyto h i l z scanf_s funkcji i wscanf_s funkcje:
scanf_s( "%ls", &x, 2 ); // Read a wide-character string
wscanf_s( "%hC",&x, 2 ); // Read a single-byte character
Jeśli za pomocą niezabezpieczonych działają w scanf z rodziny parametr rozmiaru wskazującym długość buforu poprzedni argument pominięty.
Czytanie Undelimited ciągów
Odczytać ciągów nie rozdzielone odstępy znaków, zestaw znaków w nawiasach ([]) mogą zostać zastąpione przez s znaku typu (ciąg).Zestaw znaków w nawiasach jest określone jako ciąg kontroli.Odpowiednie pole wejściowe jest odczytywana do pierwszego znaku, który jest niewidoczny w ciągu kontroli.Jeśli pierwszy znak w zestawie jest znak daszka (^), efekt jest odwrotna: pole wejściowe jest odczytywany w do pierwszego znaku, który pojawia się w pozostałej części zestawu znaków.
Należy zauważyć, że % [a–z i % [z-a są interpretowane jako równoważne z %[abcde...z.To jest wspólny scanf rozszerzenia funkcji, ale należy pamiętać, że ANSI standard nie jest to wymagane.
Czytanie niezakończony ciągów
Aby zapisać ciąg bez przechowywania kończącego znaku null (\0), użycie tej specyfikacji %nc gdzie n to dziesiętna liczba całkowita.W tym przypadku c znaku typu wskazuje, że argument jest wskaźnik do tablicy znaków.Następnego n znaki czytane od strumienia wejściowego do określonej lokalizacji, a żaden znak null (\0) jest dołączana.Jeśli n nie jest określony, jej wartością domyślną jest 1.
Kiedy scanf przestaje czytać pola
scanf Funkcja skanuje każde pole wejściowe, znak po znaku.Może zatrzymać czytanie określonego pola wejściowego, zanim dotrze znak spacji różnych powodów:
Określona szerokość została osiągnięta.
Nie można przekonwertować następny znak jak określono.
Następny znak koliduje z znaku w ciągu formantu, który ma odpowiadać.
Następny znak nie stawi się w zestawie danego znaku.
Niezależnie od przyczyny gdy scanf funkcja Zatrzymuje czytanie pole wejściowe, następne pole wejściowe uznaje się rozpoczynać się od pierwszego znaku nieprzeczytane.Znak powodujące konflikt, jeśli istnieje, jest traktowana jako nieprzeczytane i jest pierwszy znak następnego pola wejściowego lub pierwszego znaku w następnych operacjach odczytu w strumieniu wejściowym.
Zobacz też
Informacje
scanf, _scanf_l, wscanf, _wscanf_l
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l