scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

Odczytuje sformatowane dane ze standardowego strumienia wejściowego. Te wersje programu scanf, wscanf_scanf_l_wscanf_l, mają ulepszenia zabezpieczeń zgodnie z opisem w temacie Funkcje zabezpieczeń w narzędziu CRT.

Składnia

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
Formatuj ciąg sterujący.

argument
Argumenty opcjonalne.

locale
Ustawienia regionalne do użycia.

Wartość zwracana

Zwraca liczbę pól pomyślnie przekonwertowanych i przypisanych. Wartość zwracana nie zawiera pól, które zostały odczytane, ale nie zostały przypisane. Wartość zwracana 0 wskazuje, że nie przypisano pól. Wartość zwracana jest EOF dla błędu lub jeśli znak końca pliku lub znak końca ciągu zostanie znaleziony podczas pierwszej próby odczytania znaku. Jeśli format jest wskaźnikiem NULL , wywoływana jest nieprawidłowa procedura obsługi parametrów, zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonywanie jest dozwolone do kontynuowania, scanf_s i zwracanie wscanf_sEOF i ustawianie wartości errno .EINVAL

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

Uwagi

Funkcja scanf_s odczytuje dane ze standardowego strumienia wejściowego i stdinzapisuje je w pliku argument. Każdy argument musi być wskaźnikiem typu zmiennej, który odpowiada specyfikatorowi typu w programie format. Jeśli kopiowanie odbywa się między nakładającymi się ciągami, zachowanie jest niezdefiniowane.

wscanf_s jest wersją szerokoznakową ; scanf_sargument to formatwscanf_s ciąg o szerokim znaku. wscanf_s i scanf_s zachowuje się identycznie, jeśli strumień jest otwarty w trybie ANSI. scanf_s obecnie nie obsługuje danych wejściowych ze strumienia UNICODE.

Wersje tych funkcji, które mają _l sufiks, są identyczne, z wyjątkiem tego, że używają parametru locale zamiast bieżących ustawień regionalnych wątku.

W przeciwieństwie do scanf parametrów i wscanfscanf_s i wscanf_s wymagają określenia rozmiarów buforu dla niektórych parametrów. Określ rozmiary wszystkich cparametrów zestawu [] kontrolek , , Cs, Slub ciągów. Rozmiar buforu w znakach jest przekazywany jako inny parametr. Natychmiast następuje wskaźnik do buforu lub zmiennej. Jeśli na przykład odczytujesz ciąg, rozmiar buforu dla tego ciągu jest przekazywany w następujący sposób:

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

Rozmiar buforu zawiera wartość null terminalu. Możesz użyć pola specyfikacji szerokości, aby upewnić się, że token, który jest odczytywany w buforze, pasuje do buforu. Jeśli token jest zbyt duży, aby zmieścić się, nic nie jest zapisywane w buforze, chyba że istnieje specyfikacja szerokości.

Uwaga

Parametr rozmiaru jest typu unsigned, a nie size_t. Użyj rzutowania size_t statycznego, aby przekonwertować wartość na unsigned dla konfiguracji kompilacji 64-bitowej.

Parametr rozmiaru buforu opisuje maksymalną liczbę znaków, a nie bajtów. W tym przykładzie szerokość typu buforu nie jest zgodna z szerokością specyfikatora formatu.

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

Specyfikator S formatu oznacza użycie szerokości znaku , która jest "przeciwna" domyślnej szerokości obsługiwanej przez funkcję. Szerokość znaku jest pojedynczym bajtem, ale funkcja obsługuje znaki dwubajtowe. Ten przykład odczytuje ciąg o długości do dziewięciu znaków o długości jednego bajtu i umieszcza je w buforze znaków dwubajtowych. Znaki są traktowane jako wartości jedno bajtowe; pierwsze dwa znaki są przechowywane w ws[0]pliku , drugie dwa są przechowywane w ws[1]pliku i tak dalej.

W tym przykładzie odczytuje jeden znak:

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

Gdy odczytywane są wiele znaków dla ciągów bez wartości null, liczby całkowite są używane zarówno dla specyfikacji szerokości, jak i rozmiaru buforu.

char c[4];
scanf_s("%4c", c, (unsigned)_countof(c)); // not null terminated

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

Mapowania procedur tekstu ogólnego

TCHAR.H Rutynowych _UNICODE i _MBCS niezdefiniowane _MBCS Zdefiniowane _UNICODE Zdefiniowane
_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 Pola specyfikacji formatu: scanf i wscanf funkcje.

Wymagania

Procedura Wymagany nagłówek
scanf_s, _scanf_s_l <stdio.h>
wscanf_s, _wscanf_s_l <stdio.h> lub <wchar.h>

Konsola nie jest obsługiwana w aplikacjach platformy platforma uniwersalna systemu Windows (UWP). Standardowy strumień obsługuje stdin, stdouti stderr musi być przekierowywany, zanim funkcje czasu wykonywania języka C mogą używać ich w aplikacjach platformy UWP. Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.

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, (unsigned)_countof(s), ws, (unsigned)_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, (unsigned)_countof(s), ws, (unsigned)_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);
}

Ten program generuje następujące dane wyjściowe w przypadku danych wejściowych:

71 98.6 h z Byte characters
36 92.3 y n Wide characters
The number of fields input is 6
The contents are: 71 98.599998 h z Byte characters
The number of fields input is 6
The contents are: 36 92.300003 y n Wide characters

Zobacz też

Obsługa obliczeń matematycznych i zmiennoprzecinkowych
We/Wy strumienia
ustawienia regionalne
fscanf, _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