Compartilhar via


vsscanf_s, vswscanf_s

Lê dados formatados de uma cadeia de caracteres. Essas versões do , vswscanftêm aprimoramentos devsscanf segurança, conforme descrito em Recursos de segurança no CRT.

Sintaxe

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
);

Parâmetros

buffer
Dados armazenados

format
Cadeia de caracteres de controle de formato. Para obter mais informações, consulte Campos de especificação de formato: scanf e wscanf funções.

arglist
Lista de argumentos variáveis.

Valor retornado

Cada uma dessas funções retorna o número de campos que são convertidos e atribuídos com êxito. O valor retornado não inclui campos que foram lidos, mas não atribuídos. Um valor retornado igual a 0 indica que nenhum campo foi atribuído. O valor retornado será EOF para um erro ou se o fim da cadeia de caracteres for alcançado antes da primeira conversão.

Se buffer or format for um NULL ponteiro, o manipulador de parâmetro inválido será invocado, conforme descrito em Validação de parâmetro. Se a execução puder continuar, essas funções retornarão -1 e definirão errno como EINVAL.

Para obter informações sobre esses e outros códigos de erro, confira errno, _doserrno, _sys_errlist e _sys_nerr.

Comentários

A função vsscanf_s lê dados de buffer nos locais fornecidos por cada argumento na lista de argumentos arglist. Os argumentos na lista de argumentos especificam ponteiros para variáveis que têm um tipo correspondente a um especificador de tipo em format. Ao contrário da versão vsscanfmenos segura, um parâmetro de tamanho de buffer é necessário quando você usa os caracteres de campo de tipo c, C, s, S ou conjuntos de controle de cadeia de caracteres que estão entre []. O tamanho do buffer em caracteres deve ser fornecido como outro parâmetro imediatamente após cada parâmetro de buffer que o exige.

O tamanho do buffer inclui o nulo de terminação. Um campo de especificação de largura pode ser usado para garantir que o token lido caiba no buffer. Se nenhum campo de especificação de largura for usado e a leitura do token for muito grande para caber no buffer, nada será gravado nesse buffer.

Para obter mais informações, consulte scanf_s, _scanf_s_l, wscanf_se _wscanf_s_l caracteres de campo de tipo scanf.

Observação

O parâmetro de tamanho é do tipo unsigned, não size_t.

O argumento format controla a interpretação dos campos de entrada e tem o mesmo formato e a mesma função que o argumento format para a função scanf_s. Se ocorrer cópia entre cadeias de caracteres que se sobrepõem, o comportamento será indefinido.

vswscanf_s é uma versão de caractere largo de vsscanf_s; os argumentos para vswscanf_s são cadeias de caracteres largas. vsscanf_s não lida com caracteres hexadecimais multibyte. vswscanf_s não lida com caracteres hexadecimais de largura total Unicode ou de "zona de compatibilidade". Caso contrário, vswscanf_s e vsscanf_s comportam-se de modo idêntico.

Mapeamentos de rotina de texto genérico

Rotina TCHAR.H _UNICODE e _MBCS não definidos _MBCS definido _UNICODE definido
_vstscanf_s vsscanf_s vsscanf_s vswscanf_s

Requisitos

Rotina Cabeçalho necessário
vsscanf_s <stdio.h>
vswscanf_s <stdio.h> ou <wchar.h>

Para obter informações sobre compatibilidade, consulte Compatibilidade.

Exemplo

// 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

Confira também

E/S de fluxo
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