scanf, fscanf, sscanf ou wsscanf Subroutine

Propósito

Converte entrada formatada.

Biblioteca

Biblioteca C Padrão (libc.a)

ou (libc128.a)

Sintaxe

#include <stdio.h>
int scanf ( Format [,  Pointer... ])
const char *Format;
int fscanf (Stream, Format [, Pointer... ])
FILE * Stream;
const char *Format;
int sscanf (String, Format [, Pointer... ])
const char * String, *Format;
int wsscanf (wcsFormat [, Pointer, ... ])
const wchar_t *  wcs
const char *Format;

Descrição

As subroutines scanf, fscanf, sscanfe wsscanf lêem dados de caracteres, interpretam de acordo com um formato, e armazenam os resultados convertidos em locais de memória especificados. Se a subroutine receber argumentos insuficientes para o formato, os resultados não são confiáveis. Se o formato está esgotado enquanto os argumentos permanecem, a subroutine avalia o excesso de argumentos mas de outra forma os ignora.

Estas subroutines lêem sua entrada a partir das seguintes fontes:

Item Descrição
scanf Lê a partir da entrada padrão (stdin).
fscanf Lê-se a partir do parâmetro Fluxo.
sscanf Lê-se a partir da cadeia de caracteres especificada pelo parâmetro Sequência .
wsscanf Lê-se a partir da cadeia de caracteres ampla especificada pelo parâmetro wcs .

As subroutines scanf, fscanf, sscanfe wsscanf podem detectar um caractere de radix dependente do idioma, definido no locale do programa (LC_NUMÉRICO), na cadeia de entrada. No código locale C, ou em um locale que não define o caractere radix, o caractere de radix padrão é uma parada completa. (ponto).

Parâmetros

Item Descrição
wcs Especifica a cadeia de caracteres ampla a ser lida.
Fluxo Especifica o fluxo de entrada.
Sequência Especifica entrada para ser lida.
Ponteiro Especifica onde armazenar os dados interpretados.
Formato Contém especificações de conversão usadas para interpretar a entrada. Se houver argumentos insuficientes para o parâmetro Formato , os resultados não são confiáveis. Se o parâmetro Formato estiver esgotado enquanto os argumentos permanecem, os argumentos em excesso são avaliados como sempre mas são ignorados de outra forma.

O parâmetro Formato pode conter o seguinte:

  • Caracteres de espaço (branco, guia, nova-linha, vertical-guia ou forma-alimentação de caracteres) que, exceto nos dois casos a seguir, leia a entrada até o próximo caractere de espaço não branco. A menos que uma correspondência na cadeia de controle exista, o espaço em branco rasteiro (incluindo um caractere de nova linha) não é lido.
  • Qualquer caractere, exceto um% (sinal de percentual), que deve combinar com o próximo caractere do fluxo de entrada.
  • Uma especificação de conversão que direciona a conversão do campo de entrada seguinte. A especificação de conversão consiste no seguinte:
    • O% (sinal de percentual) ou a sequência de caracteres%n$.
      Observação:
      A sequência de caracteres%n$é um especificador de argumento numerado X/Open. As diretrizes para uso do especificador%n% são:
      • O valor de n em%n$deve ser um número decimal sem liderar 0's e deve estar na faixa a partir de 1 para o valor NL_ARGMAX , inclusive. Consulte o arquivo limits.h para obter mais informações sobre o valor NL_ARGMAX . Usar os principais 0's (números octais) ou um valor n maior pode ter resultados imprevisíveis.
      • Mixar especificações de argumento numeradas e não numeradas em uma sequência de formato pode ter resultados imprevisíveis. As únicas exceções são %% (dois sinais de percentual) e% * (sinal de percentual, asterisco), que podem ser misturados com o formulário%n$.
      • A referenciação de argumentos numerados na lista de argumentos a partir da sequência de caracteres mais de uma vez pode ter resultados imprevisíveis.
    • O caractere opcional de atribuição-supressão * (asterisco).
    • Um inteiro decimal opcional que especifica a largura máxima do campo.
    • Um caractere opcional que configura o tamanho da variável de recebimento para algumas bandeiras. Use os seguintes caracteres opcionais:
      l
      Longo inteiro em vez de um inteiro quando precede os códigos de conversão d, euou n ; inteiro não assinado longo em vez de inteiro não assinado quando precede os códigos de conversão o, uou x ; duplo em vez de flutuar quando precede os códigos de conversão e, f, ou g .
      ll
      Comprido longo longo em vez de um inteiro quando precede os códigos de conversão d, euou n ; inteiro não assinado longo longo em vez de inteiro não assinado quando precede os códigos de conversão o, uou x .
      L
      Um longo duplo em vez de um flutuante, quando antecedendo os códigos de conversão e, fou g ; longo inteiro em vez de um inteiro quando precede os códigos de conversão d, euou n ; inteiro não assinado longo em vez de inteiro não assinado quando precede os códigos de conversão o, u, ou x .
      h
      Um número inteiro curto em vez de um inteiro quando precede os códigos de conversão d, eue n ; um número inteiro curto não assinado (meio inteiro) em vez de um inteiro não assinado quando precede os códigos de conversão o, uou x .
      S
      _Decimal32 em vez de um float, quando precedem os códigos de conversão e, E, f, F, gou G .
      D
      _Decimal64 em vez de um float, quando precedem os códigos de conversão e, E, f, F, gou G .
      DD
      _Decimal128 em vez de um float, quando precedem os códigos de conversão e, E, f, F, gou G .
Item Descrição
Formato (cont.)
  • Um caractere opcional que configura o tamanho da variável de recebimento para tipos de dados vetoriais. Use os seguintes caracteres opcionais:
    v
    vector float (quatro componentes flutuantes de 4-byte flutuantes) quando antecedem os códigos de conversão e, E, f, g, G, aou A ; vector signed char (dezesseis componentes de char 1-byte) quando antecedem o c, d, ou i códigos de conversão; vector unsigned char ao precedem os códigos de conversão o, u, xou X .
    vl ou lv
    vector signed integer (quatro componentes inteiros de 4-byte bits) quando antecedem os códigos de conversão d ou i ; vector unsigned integer quando antecedem os códigos de conversão o, u, xou X .
    vh ou hv
    vector signed short (oito componentes inteiros de 2-byte bits) quando antecedem os códigos de conversão d ou i ; vector unsigned short quando antecedem os códigos de conversão o, u, xou X .
    Para qualquer um dos especificadores precedentes, um caractere separador opcional pode ser especificado imediatamente precedendo o especificador de tamanho do vetor. Se nenhum separador for especificado, o separador padrão é um espaço a menos que a conversão seja c, caso em que o separador padrão é nulo. O conjunto de separadores opcionais suportados são , (vírgula), ; (ponto e vírgula), : (dois colon) e _ (sublinhado).
  • Um código de conversão que especifica o tipo de conversão a ser aplicada.

    A especificação de conversão assume o formulário:

    %[*][width][size]convcode

Os resultados da conversão são colocados no local de memória designado pelo parâmetro Ponteiro , a menos que você especifique supressão de designação com um * (asterisco). A supressão de designação fornece uma maneira de descrever um campo de entrada a ser ignorada. O campo de entrada é uma sequência de caracteres de espaços não brancos. Ele se estende até o próximo caractere inadequado ou até que a largura do campo, se especificado, esteja esgotada.

O código de conversão indica como interpretar o campo de entrada. O parâmetro Ponteiro correspondente deve ser um tipo restrito. Não especifique o parâmetro Ponteiro para um campo suprimido. Você pode utilizar os seguintes códigos de conversão:

%
Aceita uma entrada única% (sinal de percentual) neste ponto; nenhuma atribuição ou conversão é feita. A especificação de conversão completa deve ser %% (dois sinais de percentual).
D
Aceita um número inteiro decimal opcionalmente assinado com o mesmo formato que o esperado para a sequência de assunto da subroutine strtol com um valor de 10 para o parâmetro base . Se nenhum modificador de tamanho for especificado, o parâmetro Ponteiro deverá ser um ponteiro para um inteiro.
i
Aceita um número inteiro opcionalmente assinado com o mesmo formato que o esperado para a sequência de assunto da subroutine strtol com um valor de 0 para o parâmetro base . Se nenhum modificador de tamanho for especificado, o parâmetro Ponteiro deverá ser um ponteiro para um inteiro.
u
Aceita um número inteiro decimal opcionalmente assinado com o mesmo formato que o esperado para a sequência de assunto da subroutine estrtoul com um valor de 10 para o parâmetro base . Se nenhum modificador de tamanho for especificado, o parâmetro Ponteiro deverá ser um ponteiro para um inteiro não assinado.
o
Aceita um inteiro octal opcionalmente assinado com o mesmo formato que o esperado para a sequência de assunto da subroutine estrtoul com um valor de 8 para o parâmetro base . Se nenhum modificador de tamanho for especificado, o parâmetro Ponteiro deverá ser um ponteiro para um inteiro não assinado.
X
Aceita um inteiro hexadecimal assinado opcionalmente com o mesmo formato que o esperado para a sequência de assunto da subroutine estrtoul com um valor de 16 para o parâmetro base . Se nenhum modificador de tamanho for especificado, o parâmetro Ponteiro deverá ser um ponteiro para um inteiro.
e, fou g
Aceita um número de ponto flutuante opcionalmente assinado com o mesmo formato que o esperado para a sequência de assunto da subroutine strtod . O campo seguinte é convertido em conformidade e armazenado através do parâmetro correspondente; se nenhum modificador de tamanho for especificado, este parâmetro deverá ser um ponteiro para um float. O formato de entrada para números de ponto flutuante é uma sequência de algarías, com algumas características opcionais:
  • Pode ser um valor assinado.
  • Ele pode ser um valor exponencial, contendo um número decimal decimal seguido de um campo expoente, que consiste em um E ou um e seguido de um inteiro (opcionalmente assinado).
  • Ele pode ser um dos valores especiais INF, NaNQ ou NaNS. Esse valor é convertido no valor IEEE-754 para infinito, NaN silencioso ou NaN de sinalização, respectivamente.
P
Corresponde um número inteiro hexadecimal não assinado, o mesmo que a conversão %p da subroutine printf . O parâmetro correspondente é um ponteiro para um ponteiro vazio. Se o item de entrada for um valor convertido anteriormente durante a mesma execução do programa, o ponteiro resultante se compara igual a esse valor; caso contrário, os resultados da conversão %p são imprevisíveis.
n
Consome sem entrada. O parâmetro correspondente é um ponteiro para um inteiro no qual o subbroutine scanf, fscanf, sscanfou wsscanf grava o número de caracteres (incluindo caracteres amplos) lidos a partir do fluxo de entrada. A contagem de designações retornadas na conclusão desta função não é incrementada.
s
Aceita uma sequência de caracteres de espaço não branco (scanf, fscanfe sscanf subroutines). A subroutine wsscanf aceita uma sequência de códigos de caracteres de largura não-branco-espaço; esta sequência é convertida em uma sequência de caracteres da mesma maneira que a subroutine wcstombs . O parâmetro Ponteiro deve ser um ponteiro para o byte inicial de um char, assinado char, ou unsigned char array grande o suficiente para segurar a sequência e um código de caracteres nula de terminação, que é automaticamente adicionado.
S
Aceita uma sequência de caracteres de espaço não branco (scanf, fscanfe sscanf subroutines). Esta sequência é convertida em uma sequência de códigos de caracteres amplos da mesma maneira que a subroutina mbstowcs . A subroutine wsscanf aceita uma sequência de códigos de caracteres de largura não-branco-espaço. O parâmetro Ponteiro deve ser um ponteiro para o código de caracteres de largura inicial de uma matriz grande o suficiente para aceitar a sequência e um código de caracteres de largura nula de terminação, que é automaticamente adicionado. Se a largura do campo for especificada, ele denota o número máximo de caracteres a aceitar.
c
Aceita uma sequência de bytes do número especificado pela largura do campo (scanf, fscanf e sscanf subroutines); se nenhuma largura de campo for especificada, 1 é o padrão. A subroutine wsscanf aceita uma sequência de códigos de caracteres amplos do número especificado pela largura do campo; se nenhuma largura de campo for especificada, 1 é o padrão. A sequência é convertida em uma sequência de caracteres da mesma maneira que a subroutine wcstombs . O parâmetro Ponteiro deve ser um ponteiro para os bytes iniciais de uma matriz grande o suficiente para segurar a sequência; nenhum byte nulo é adicionado. O pulo normal sobre o espaço em branco não ocorre.
C
Aceita uma sequência de caracteres do número especificado pela largura do campo (scanf, fscanfe sscanf subroutines); se nenhuma largura de campo for especificada, 1 é o padrão. A sequência é convertida em uma sequência de códigos de caracteres amplos da mesma maneira que a subroutina mbstowcs . A subroutine wsscanf aceita uma sequência de códigos de caracteres amplos do número especificado pela largura do campo; se nenhuma largura de campo for especificada, 1 é o padrão. O parâmetro Ponteiro deve ser um ponteiro para o código de caracteres de largura inicial de uma matriz grande o suficiente para segurar a sequência; nenhum código de caracteres de largura nula é adicionado.
[scanset]
Aceita uma sequência não vazia de bytes a partir de um conjunto de bytes esperados especificado pela variável scanset (scanf, fscanfe sscanf subroutines). A subroutine wsscanf aceita uma sequência não vazia de códigos de caracteres amplos a partir de um conjunto de códigos de caracteres bastante esperados especificados pela variável scanset . A sequência é convertida em uma sequência de caracteres da mesma maneira que a subroutine wcstombs . O parâmetro Ponteiro deve ser um ponteiro para o caractere inicial de um char, assinado charou sem assinatura char matriz grande o suficiente para segurar a sequência e um byte null de terminação, que é automaticamente adicionado. Nas subroutines scanf, fscanfe sscanf , a especificação de conversão inclui todos os bytes subsequentes na string especificada pelo parâmetro Formato , até e incluindo o] (suporte direito). Os bytes entre os suportes compreendem a variável scanset , a menos que o byte após o [(suporte esquerdo) seja um ^ (circumflex). Neste caso, a variável scanset contém todos os bytes que não aparecem na scanlist entre o ^ (circumflex) e o] (suporte direito). Na subroutine wsscanf , os caracteres entre os suportes são primeiramente convertidos em códigos de caracteres amplos da mesma maneira que o subroutine mbtowc . Esses códigos de caracteres amplos são então usados como descrito acima no lugar dos bytes na scanlist. Se a especificação de conversão começar com [] ou [^], o suporte direito será incluído na scanlist e o suporte da próxima direita é o suporte de direita correspondente que acaba com a especificação de conversão. Você também pode:
  • Representar uma gama de caracteres pela construção Primeiro-Último. Assim, você pode expressar [0123456789] como [0-9]. O parâmetro Primeiro deve ser lexicamente menor ou igual ao parâmetro Último ou então o-(traço) representa para si mesmo. O-também fica por si mesmo sempre que é o primeiro ou o último caractere na variável scanset .
  • Inclua o] (suporte direito) como um elemento da variável scanset se ele for o primeiro caractere do scanset. Neste caso ele não é interpretado como o suporte que fecha a variável scanset . Se a variável scanset for uma variável exclusiva scanset , o] é precedido pelo ^ (circumflex) para fazer do] um elemento do scanset. O parâmetro Ponteiro correspondente deve apontar para uma matriz de caracteres grande o suficiente para segurar o campo de dados e que termina com um caractere nulo (\0). O \0 é incluído automaticamente.

Uma conversão scanf termina no final-de-arquivo (caractere EOF), no final da cadeia de controle ou quando um caractere de entrada conflata com a cadeia de controle. Se ele terminar com um conflito de caracteres de entrada, o caractere conflitante não é lido a partir do fluxo de entrada.

A menos que uma correspondência na cadeia de controle exista, o espaço em branco rasteiro (incluindo um caractere de nova linha) não é lido.

O sucesso de correspondências literais e assignações suprimidas não é diretamente determinável.

As extensões do National Language Support (NLS) para as subroutines scanf podem manipular uma string de formato que possibilita que o sistema processe elementos da lista de argumentos em ordem variável. O caractere de conversão normal% é substituído por%n$, onde n é um número decimal. Conversões são, então, aplicadas ao argumento especificado (ou seja, o nth argumento), em vez de para o próximo argumento não utilizado.

The first successful run of the fgetc, fgets, freada, getc, getchar, fica, scanf, or fscanf subroutine using a stream that returns data not supplied by a prior call to the ungetc (ingetc ou ungetwc Subroutine) subroutine marks thest_atimecampo para atualização.

Valores De Retorno

Essas subroutines retornam o número de itens de entrada com sucesso de correspondência e atribuídos. Este número pode ser 0 se um conflito inicial existisse entre um caractere de entrada e a cadeia de controle. Se a entrada terminar antes do primeiro conflito ou conversão, apenas EOF é retornado. Se ocorrer um erro de leitura, o indicador de erro para o fluxo será configurado, EOF será retornado e a variável global errno será definida para indicar o erro.

Códigos De Erro

As subroutines scanf, fscanf, sscanfe wsscanf não são bem-sucedidas se ou o arquivo especificado pelo parâmetro Fluxo, Sequênciaou wcs estiver sem buffer ou dados precisa ser lido no buffer do arquivo e uma ou mais das seguintes condições é verdadeira:

Item Descrição
EAGAIN O sinalizador O_NONBLOCK é configurado para o descritor de arquivo subjacente ao arquivo especificado pelo parâmetro Fluxo, Sequênciaou wcs , e o processo seria retardado na operação scanf, fscanf, sscanf, ou wsscanf .
EBADF O descritor de arquivo subjacente ao arquivo especificado pelo parâmetro Fluxo, Sequênciaou wcs não é um descritor de arquivo válido aberto para leitura.
EINTR A operação de leitura foi finalizada devido ao recebimento de um sinal, e nem nenhum dado foi transferido ou uma transferência parcial não foi informada.
Nota: Dependendo de qual rotina da biblioteca o aplicativo se liga, esta subroutine pode retornar EINTR. Consulte a subroutina sinal (sigação, sigvec ou sinal Subroutine) a respeito de SA_RESTART.
Item Descrição
EIO O processo é um membro de um grupo de processos de background tentando realizar uma leitura a partir de seu terminal de controle, e ou o processo está ignorando ou bloqueando o sinal SIGTTIN ou o grupo de processos não tem nenhum processo pai.
EINVAL A subroutine recebeu argumentos insuficientes para o parâmetro Formato .
EILSEQ Uma sequência de caracteres que não é válida foi detectada, ou um código de caráter amplo não corresponde a um caractere válido.
ENOMEM O espaço de armazenamento insuficiente está disponível.