Pola specyfikacji formatu: scanf i wscanf funkcje

Informacje te dotyczą całej scanf rodziny funkcji, w tym bezpiecznych wersji. Opisuje on symbole używane do określania scanf sposobu analizowania strumienia wejściowego, takiego jak strumień stdinwejściowy , do wartości wstawionych do zmiennych programu.

Argument format jest ciągiem określającym interpretację danych wejściowych i może zawierać co najmniej jeden z następujących elementów:

  • Znaki odstępu: puste ( ); tabulator (\t) lub nowy wiersz (\n). Znak odstępu powoduje scanf odczytywanie, ale nie przechowywanie, wszystkie kolejne znaki odstępu w danych wejściowych do następnego znaku innego niż biały znak. Jeden znak odstępu w formacie jest zgodny z dowolną liczbą (w tym 0) i kombinacją znaków odstępu w danych wejściowych.

  • Znaki inne niż odstępy, z wyjątkiem znaku procentu (%). Znak inny niż biały powoduje scanf odczytywanie, ale nie przechowywanie pasującego znaku odstępu. Jeśli następny znak w strumieniu wejściowym nie jest zgodny, scanf kończy działanie.

  • Specyfikacje formatu wprowadzone przez znak procentu (%). Specyfikacja formatu powoduje scanf odczytywanie i konwertowanie znaków w danych wejściowych na wartość określonego typu. Wartość jest przypisywana do argumentu na liście argumentów.

    Specyfikacja formatu ma następującą postać:

    %[*][width][{h|l|ll|I64|L}]type

    Tutaj, width, , h, lll, I64, i L reprezentują specyfikację scanfszerokości i type reprezentuje scanfznak pola typu.

Ciąg argumentu format jest odczytywany od lewej do prawej. Oczekuje się, że znaki poza specyfikacjami formatu będą zgodne z sekwencją znaków w strumieniu wejściowym. Pasujące znaki w strumieniu wejściowym są skanowane, ale nie są przechowywane. Jeśli znak w strumieniu wejściowym powoduje konflikt ze specyfikacją formatu, scanf kończy działanie, a znak pozostaje w strumieniu wejściowym tak, jakby nie został odczytany.

Po napotkaniu pierwszej specyfikacji formatu wartość pierwszego pola wejściowego jest konwertowana zgodnie z tą specyfikacją. Ta wartość jest przechowywana w lokalizacji określonej przez pierwszy argument, który jest zgodny z argumentem format . Druga specyfikacja formatu powoduje przekonwertowanie drugiego pola wejściowego i zapisanie go w następnym argumencie itd. przez koniec ciągu formatu.

Pole wejściowe jest definiowane jako: Wszystkie znaki do pierwszego znaku odstępu (spacja, karta lub nowy wiersz) albo do pierwszego znaku, którego nie można przekonwertować zgodnie ze specyfikacją formatu, lub dopóki szerokość pola (jeśli określono) nie zostanie osiągnięta. Jeśli dla danej specyfikacji istnieje zbyt wiele argumentów, dodatkowe argumenty są oceniane, ale ignorowane. Wyniki są nieprzewidywalne, jeśli nie ma wystarczającej liczby argumentów dla specyfikacji formatu.

Każde pole specyfikacji formatu jest pojedynczym znakiem lub liczbą oznaczającą określony format. Znak type , który pojawia się po ostatnim opcjonalnym polu formatu, określa, czy pole wejściowe jest interpretowane jako znak, ciąg lub liczba.

Najprostsza specyfikacja formatu zawiera tylko znak procentu type i znak (na przykład %s). Jeśli znak procentu (%) następuje znak, który nie ma znaczenia jako znak kontrolki formatu, ten znak i następujące znaki (do następnego znaku procentu) są traktowane jako zwykła sekwencja znaków. Oznacza to, że są traktowane jako sekwencja znaków, które muszą być zgodne z danymi wejściowymi. Aby na przykład określić, że znak procentu ma być wejściowy, użyj polecenia %%.

Gwiazdka (*) po znaku procentu pomija przypisanie następnego pola wejściowego, które jest interpretowane jako pole określonego typu. Pole jest skanowane, ale nie jest przechowywane w argumencie.

Bezpieczne wersje (te z _s sufiksem) scanf rodziny funkcji wymagają każdego parametru typu c, C, sS lub[, aby parametr rozmiaru buforu został przekazany natychmiast po. Aby uzyskać więcej informacji na temat bezpiecznych wersji scanf rodziny funkcji, zobaczscanf_s , _scanf_s_l, wscanf_s, _wscanf_s_l.

Zobacz też

scanf Specyfikacja szerokości
scanf Wpisz znaki pola
scanf, _scanf_l, wscanf, _wscanf_l
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l