Especificação de largura scanf

Essas informações se aplicam à interpretação de cadeias de caracteres de formato na família de funções scanf, incluindo as versões protegidas, como scanf_s. Essas funções geralmente pressupõem que o fluxo de entrada é dividido em uma sequência de tokens. Os tokens são separados por espaços em branco (espaço, tabulação ou nova linha) ou, para tipos numéricos, pelo final natural de um tipo de dados numéricos, conforme indicado pelo primeiro caractere que não pode ser convertido em texto numérico. No entanto, a especificação de largura pode ser usada para fazer com que a análise da entrada pare antes do final natural de um token.

O especificação de width consiste em caracteres entre % e o especificador de campo de tipo, que pode incluir um número inteiro positivo chamado campo width e um ou mais caracteres indicando o tamanho do campo, que também pode ser considerado como modificadores do tipo de campo, como uma indicação se o tipo de inteiro é short ou long. Esses caracteres são chamados de prefixo de tamanho.

O campo width

O campo width é um número inteiro decimal positivo que controla o número máximo de caracteres a ser lido nesse campo. Os caracteres de width são o máximo que pode ser convertido e armazenado no argument correspondente. A leitura pode ser menor do que os caracteres de width se um caractere de espaço em branco ou um caractere que não puder ser convertido de acordo com o formato determinado ocorre antes da width ser alcançada.

A especificação de largura é separada e distinta do argumento de tamanho de buffer exigido para as versões protegidas dessas funções (por exemplo, scanf_s, wscanf_s e assim por diante). No exemplo a seguir, a especificação de largura é 20, indicando que até 20 caracteres devem ser lidos do fluxo de entrada. O comprimento do buffer é 21, que inclui espaço para 20 caracteres possíveis mais o terminador nulo:

char str[21];
scanf_s("%20s", str, 21);

Se o campo width não for usado, scanf_s tentará ler o token inteiro na cadeia de caracteres. Se o tamanho especificado não for grande o suficiente para armazenar o token inteiro, nada será gravado na cadeia de caracteres de destino. Se o campo width for especificado, os primeiros caracteres da width no token serão gravados na cadeia de caracteres de destino juntamente com o terminador nulo.

O prefixo de tamanho

Os prefixos opcionais h, hh, l, ll, I64 e L indicam o tamanho do argument (longo ou curto, caracteres de byte único ou caractere largo, dependendo do caractere de tipo que eles modificam). Esses caracteres de especificação de formato são usados com caracteres de tipo nas funções scanf ou wscanf para especificar a interpretação dos argumentos, como mostrado na tabela a seguir. O prefixo I64 de tipo é uma extensão da Microsoft e não é compatível com o padrão C. Os caracteres de tipo e seus significados são descritos na tabela "Caracteres de tipo para funções scanf" em scanf caracteres de campo de texto.

Observação

Os prefixos h, l e L são extensões da Microsoft quando usados com os dados do tipo char.

Prefixos de tamanho para especificadores de tipo de formato scanf e wscanf

Para especificar Use o prefixo Com especificador de tipo
double l e, E, f, g ou G
long double (mesmo que double) L e, E, f, g ou G
long int l d, i, o, x ou X
long unsigned int l u
long long ll d, i, o, x ou X
short int h d, i, o, x ou X
short unsigned int h u
char hh d, i, o, x ou X
unsigned char hh u
int64 I64 d, i, o, u, x ou X
Caractere de um byte com scanf h c ou C
Caractere de um byte com wscanf h c ou C
Caracteres largos com scanf l c ou C
Caracteres largos com wscanf l c ou C
Cadeia de caracteres de um byte com scanf h s ou S
Cadeia de caracteres de um byte com wscanf h s ou S
Cadeia de caracteres largos com scanf l s ou S
Cadeia de caracteres largos com wscanf l s ou S

Os exemplos abaixo usam h and l com funções scanf_s e funções wscanf_s:

scanf_s("%ls", &x, 2);     // Read a wide-character string
wscanf_s(L"%hC", &x, 2);    // Read a single-byte character

Se estiver usando uma função não segura na família scanf, omita o parâmetro de tamanho que indica o comprimento do buffer do argumento anterior.

Leitura de cadeias de caracteres não delimitadas

Para ler cadeias de caracteres não delimitadas por caracteres de espaço em branco, um conjunto de caracteres entre colchetes ([ ]) pode ser substituído pelo caractere de tipo s (cadeia de caracteres). O conjunto de caracteres entre colchetes é chamado de cadeia de caracteres de controle. O campo de entrada correspondente é lido até o primeiro caractere que não aparece na cadeia de caracteres de controle. Se o primeiro caractere no conjunto for um acento circunflexo (^), o efeito será inverso: o campo de entrada será lido até o primeiro caractere que aparece no restante do conjunto de caracteres.

Ambos %[a-z] e %[z-a] são interpretados como equivalentes a %[abcde...z]. É uma extensão de função comum scanf, mas não é exigida pelo C Padrão.

Leitura de cadeias de caracteres não finalizadas

Para armazenar uma cadeia de caracteres sem armazenar um caractere nulo de terminação ('\0'), use a especificação %Nc, em que N é um inteiro decimal. Nesse caso, o caractere de tipo c indica que o argumento é um ponteiro para uma matriz de caracteres. Os próximos N caracteres são lidos no fluxo de entrada e colocados no local especificado e nenhum caractere nulo ('\0') é acrescentado. Se N não for especificado, o valor padrão será 1.

Quando scanf interrompe a leitura de um campo

A função scanf examina cada campo de entrada, caractere por caractere. Ela pode parar de ler um determinado campo de entrada antes de alcançar um caractere de espaço por causa de um desses vários motivos:

  • A largura especificada foi alcançada.

  • O próximo caractere não pode ser convertido conforme especificado.

  • O caractere seguinte entra em conflito com um caractere na cadeia de controle com o qual deveria corresponder.

  • O caractere seguinte não aparece em um determinado conjunto de caracteres.

Por algum motivo, quando a função scanf para de ler um campo de entrada, o próximo campo de entrada é considerado começando no primeiro caractere não lido. O caractere conflitante, se houver, é considerado não lido. Ele é o primeiro caractere do próximo campo de entrada ou o primeiro caractere em operações de leitura subsequentes no fluxo de entrada.

Confira também

scanf, _scanf_l, wscanf, _wscanf_l
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l
Campos de especificação de formato: scanf e wscanf funções
Caracteres de campo de tipo scanf