Udostępnij za pośrednictwem


vsscanf_s, vswscanf_s

Odczytuje sformatowane dane z ciągu. Te wersje programu vsscanf vswscanfmają ulepszenia zabezpieczeń zgodnie z opisem w temacie Funkcje zabezpieczeń w narzędziu CRT.

Składnia

int vsscanf_s(
   const char *buffer,
   const char *format,
   va_list argptr
);
int vswscanf_s(
   const wchar_t *buffer,
   const wchar_t *format,
   va_list arglist
);

Parametry

buffer
Przechowywane dane

format
Ciąg kontroli formatu. Aby uzyskać więcej informacji, zobacz Pola specyfikacji formatu: scanf i wscanf funkcje.

arglist
Lista argumentów zmiennej.

Wartość zwracana

Każda z tych funkcji zwraca liczbę pól, które zostały pomyślnie przekonwertowane i przypisane. Wartość zwracana nie zawiera pól, które zostały odczytane, ale nie zostały przypisane. Wartość zwracana 0 wskazuje, że żadne pola nie zostały przypisane. Wartość zwracana jest EOF dla błędu lub jeśli koniec ciągu zostanie osiągnięty przed pierwszą konwersją.

Jeśli buffer lub 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 wykonanie może kontynuować, te funkcje zwracają wartość -1 i ustawiają wartość errno EINVAL.

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

Uwagi

Funkcja vsscanf_s odczytuje dane z buffer lokalizacji, które są podane przez każdy argument na arglist liście argumentów. Argumenty na liście argumentów określają wskaźniki do zmiennych, które mają typ odpowiadający specyfikatorowi typu w programie format. W przeciwieństwie do mniej bezpiecznej wersji vsscanfparametr rozmiaru buforu jest wymagany w przypadku używania znaków pól typu c, C, s, S lub zestawów kontrolek ciągów, które są ujęte w []. Rozmiar buforu w znakach musi być podany jako inny parametr bezpośrednio po każdym parametrze buforu, który go wymaga.

Rozmiar buforu zawiera wartość null zakończenia. Pole specyfikacji szerokości może służyć do zapewnienia, że token odczytany w pliku będzie pasował do buforu. Jeśli nie jest używane pole specyfikacji szerokości, a odczyt tokenu jest zbyt duży, aby zmieścić się w buforze, nic nie jest zapisywane w tym buforze.

Aby uzyskać więcej informacji, zobacz scanf_s, _scanf_s_l, _wscanf_s_lwscanf_s i scanf Type Field Characters (Znaki pól typu scanf).

Uwaga

Parametr rozmiaru jest typu unsigned, a nie size_t.

format Argument steruje interpretacją pól wejściowych i ma taką samą formę i funkcję jak format argument funkcjiscanf_s. Jeśli kopiowanie odbywa się między nakładającymi się ciągami, zachowanie jest niezdefiniowane.

vswscanf_s jest wersją szerokoznakową ; vsscanf_sargumenty, które mają vswscanf_s być ciągami o szerokim znaku. vsscanf_s nie obsługuje znaków szesnastkowy wielobajtowych. vswscanf_s Nie obsługuje znaków szesnastkowe ani "strefa zgodności" w formacie Unicode o pełnej szerokości. vswscanf_s W przeciwnym razie i vsscanf_s zachowują się identycznie.

Mapowania procedur tekstu ogólnego

Procedura TCHAR.H _UNICODE i _MBCS niezdefiniowane _MBCS zdefiniowany _UNICODE zdefiniowany
_vstscanf_s vsscanf_s vsscanf_s vswscanf_s

Wymagania

Procedura Wymagany nagłówek
vsscanf_s <stdio.h>
vswscanf_s <stdio.h> lub <wchar.h>

Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.

Przykład

// crt_vsscanf_s.c
// compile with: /W3
// This program uses vsscanf_s to read data items
// from a string named tokenstring, then displays them.

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

int call_vsscanf_s(char *tokenstring, char *format, ...)
{
    int result;
    va_list arglist;
    va_start(arglist, format);
    result = vsscanf_s(tokenstring, format, arglist);
    va_end(arglist);
    return result;
}

int main( void )
{
    char  tokenstring[] = "15 12 14...";
    char  s[81];
    char  c;
    int   i;
    float fp;

    // Input various data from tokenstring:
    // max 80 character string:
    call_vsscanf_s(tokenstring, "%80s", s, _countof(s));
    call_vsscanf_s(tokenstring, "%c", &c, sizeof(char));
    call_vsscanf_s(tokenstring, "%d", &i);
    call_vsscanf_s(tokenstring, "%f", &fp);

    // Output the data read
    printf("String    = %s\n", s);
    printf("Character = %c\n", c);
    printf("Integer:  = %d\n", i);
    printf("Real:     = %f\n", fp);
}
String    = 15
Character = 1
Integer:  = 15
Real:     = 15.000000

Zobacz też

We/Wy strumienia
scanf, , _scanf_l, , wscanf_wscanf_l
sscanf, , _sscanf_l, , swscanf_swscanf_l
sscanf_s, , _sscanf_s_l, , swscanf_s_swscanf_s_l
sprintf, , _sprintf_l, swprintf, , _swprintf_l__swprintf_l
vsscanf, vswscanf