Udostępnij za pośrednictwem


scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

Odczyt sformatowane dane z Standardowy strumień wejściowy.Są to wersje scanf, _scanf_l, wscanf, _wscanf_l z ulepszeń zabezpieczeń, zgodnie z opisem w Funkcje zabezpieczeń w CRT.

int scanf_s(
   const char *format [,
   argument]... 
);
int _scanf_s_l(
   const char *format,
   locale_t locale [,
   argument]... 
);
int wscanf_s(
   const wchar_t *format [,
   argument]... 
);
int _wscanf_s_l(
   const wchar_t *format,
   locale_t locale [,
   argument]... 
);

Parametry

  • format
    Ciąg formatu formantu.

  • argument
    Argumentów opcjonalnych.

  • locale
    Ustawienia regionalne używane.

Wartość zwracana

Zwraca liczbę pól pomyślnie przekonwertowane i przypisane; zwracana wartość nie zawiera pola, które były odczytać, ale nie są przypisane.Zwracana wartość wynosząca 0 wskazuje, że przydzielono żadnych pól.Wartość zwracana jest EOF dla błąd lub jeśli znak końca pliku lub znak końca ciągu w pierwszej próbie odczytać znak.Jeśli format jest NULL wskaźnik, program obsługi nieprawidłowy parametr jest wywoływana, zgodnie z opisem w Sprawdzanie poprawności parametru.Jeśli wykonanie może kontynuować, scanf_s i wscanf_s zwrotu EOF i ustawić errno do EINVAL.

Aby uzyskać informacje o tych i innych kodów błędów, zobacz _doserrno, errno, _sys_errlist i _sys_nerr.

Uwagi

scanf_s Funkcja odczytuje dane z Standardowy strumień wejściowy stdin i zapisuje dane do lokalizacji określonej przez argument.Każdy argument musi być wskaźnik do zmiennej typu, który odpowiada specyfikatora typu w format.Jeśli kopiowanie odbywa się między ciągami, które nakładają się, zachowanie jest niezdefiniowane.

wscanf_sjest ona szerokich znaków do scanf_s; format argument wscanf_s jest ciągiem szerokich znaków.wscanf_si scanf_s zachowują się identycznie identycznie, jeśli strumień jest otwarty w trybie ANSI.scanf_saktualnie nie obsługuje dane wejściowe ze strumienia UNICODE.

Wersje te funkcje za pomocą _l sufiks są identyczne z tym, że używają przekazany zamiast bieżących ustawień regionalnych wątek parametr ustawień regionalnych.

Unlike scanfand wscanf, scanf_sand wscanf_srequire the buffer size to be specified for all input parameters of type c, C, s, S, or [.Rozmiar bufora w znakach jest przekazywana jako dodatkowy parametr natychmiast po wskaźnik do buforu lub zmiennej.Na przykład jeśli czyta ciąg, rozmiar buforu dla tego ciągu przechodzi się następujące zmiany:

char s[10];

scanf_s("%9s", s, _countof(s)); // buffer size is 10, width specification is 9

Rozmiar buforu zawiera zakończenie null.Szerokość pola Specyfikacja może służyć do zapewnienia, że token w zmieści się w buforze.Jeśli nie szerokość pola Specyfikacja jest używana, a token odczytać jest zbyt duży, aby zmieścić się w buforze, nic nie zostaną zapisane do tego buforu.

[!UWAGA]

Parametr rozmiaru jest typu unsigned, a nie size_t.

Poniższy przykład pokazuje, że parametr rozmiaru buforu opisuje maksymalną liczbę znaków, nie bajtów.W wywołaniu wscanf_s, szerokość znaków, który jest wskazywany przez typ buforu nie pasuje szerokość znaków, który jest wskazywany przez określenie formatu.

wchar_t ws[10];
wscanf_s("%9S", ws, _countof(ws));

S Specyfikatora formatu oznacza użycie szerokość znaków, który znajduje się "na domyślną szerokość, który jest obsługiwany przez funkcję naprzeciwko".Szerokość znaków jest jednobajtową, ale funkcja obsługuje znaki dwubajtowe.W tym przykładzie odczytuje w ciągu maksymalnie 9 znaków pojedynczej bajt szerokości i umieszcza je w buforze podwójnej bajt szerokości znaku.Znaki są traktowane jako wartości jednobajtowych; dwa pierwsze znaki są przechowywane w ws[0], drugie dwie są przechowywane w ws[1]i tak dalej.

W przypadku znaków jeden może otrzymują pojedynczy znak brzmienie:

char c;

scanf_s("%c", &c, 1);

Podczas czytania wielu znaków zakończonych ciągi inne niż null, liczby całkowite są używane jako szerokość specyfikacji i rozmiar buforu.

char c[4];

scanf_s("%4c", &c, _countof(c)); // not null terminated

Aby uzyskać więcej informacji, zobacz scanf Specyfikacja szerokość.

Tekst rodzajowy rutynowych mapowania

TCHAR.Rozpoczęto wykonywanie procedury h

_UNICODE & _MBCS nie zdefiniowany

_MBCS, definicja

_UNICODE, definicja

_tscanf_s

scanf_s

scanf_s

wscanf_s

_tscanf_s_l

_scanf_s_l

_scanf_s_l

_wscanf_s_l

Aby uzyskać więcej informacji, zobacz pól specyfikacji formatu — scanf funkcje jak i wscanf.

Wymagania

Rozpoczęto wykonywanie procedury

Wymaganego nagłówka

scanf_s, _scanf_s_l

<stdio.h>

wscanf_s, _wscanf_s_l

<stdio.h> lub <wchar.h>

Konsola nie jest obsługiwana w Windows Store aplikacji.Związanych z konsolą, dojścia do strumienia standard stdin, stdout, i stderr, muszą być przeniesione, aby funkcje uruchomieniowej C mogą być użyte w Windows Store aplikacji.Aby uzyskać dodatkowe informacje o zgodności, zobacz zgodności we wprowadzeniu.

Przykład

// crt_scanf_s.c
// This program uses the scanf_s and wscanf_s functions
// to read formatted input.
  
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
   int      i,
            result;
   float    fp;
   char     c,
            s[80];
   wchar_t  wc,
            ws[80];

   result = scanf_s( "%d %f %c %C %s %S", &i, &fp, &c, 1,
                     &wc, 1, s, _countof(s), ws, _countof(ws) );
   printf( "The number of fields input is %d\n", result );
   printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c,
           wc, s, ws);
   result = wscanf_s( L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,
                      &wc, 1, s, _countof(s), ws, _countof(ws) );
   wprintf( L"The number of fields input is %d\n", result );
   wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp,
            c, wc, s, ws);
}
  

Odpowiednik w programie .NET Framework

Zobacz też

Informacje

Wsparcie zmiennoprzecinkowe

Strumień we/wy

Ustawienia regionalne

fscanf — przetwarza dane, _fscanf_l, fwscanf, _fwscanf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

sscanf, _sscanf_l, swscanf, _swscanf_l