Compartilhar via


Especificação de largura scanf Width

Essas informações são aplicadas à interpretação de cadeias de formato da família de scanf de funções, inclusive as versões seguros como scanf_s. Essas funções a seguir pressupõem normalmente o fluxo de entrada são divididas em uma sequência de tokens. Os tokens são separados por espaço em branco (espaço, guia, ou nova linha) ou, no caso de tipos numéricos, pela extremidade natural de um tipo de dados numérico como 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 de entrada pare antes de extremidade natural de um token.

A especificação de largura consiste em caracteres entre % e o especificador do campo de tipo, que podem incluir um inteiro positivo o campo chamado de largura e um ou mais caracteres que indica o tamanho do campo, que também pode ser considerado como modificadores do tipo do campo, como uma indicação se o tipo inteiro é short ou long. Esses caracteres são referidos como o prefixo do tamanho.

O campo de largura

O campoda largura é um inteiro positivo decimal que controla o número máximo de caracteres a serem lidos para esse campo. Não mais do que caracteres de largura são convertidas e armazenadas em argumentcorrespondente. Menor que caracteres de largura podem ser lidos se um caractere de espaço em branco (espaço, guia, ou nova linha) ou um caractere que não podem ser convertidos de acordo com o formato determinado ocorrem antes que a largura seja atingida.

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

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

Se o campo de largura 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 manter o token inteiro, nada será gravado na cadeia de caracteres de destino. Se o campo de largura for especificado, os primeiros caracteres de largura no token serão gravados na cadeia de caracteres de destino com o terminador nulo.

O tamanho de prefixo

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

Dica

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

Prefixos para dimensionar especificadores das tipo de scanf e de wscanf

Para especificar

Usar prefixo

Com o especificador de tipo

double

l

e, E, f, g, ou G

long double (mesmo que o dobro)

L

e, E, f, g, ou G

int longo

l

d, i, o, x, ou X

int sem assinatura longo

l

u

longo longo

ll

d, i, o, x, ou X

short int

h

d, i, o, x, ou X

int sem assinatura curto

h

u

int64

I64

d, i, o, u, x, ou X

Caractere de byte único com scanf

h

c ou C

Caractere de byte único com wscanf

h

c ou C

Caractere largo com scanf

l

c ou C

Caractere largo com wscanf

l

c, ou C

Um byte – cadeia de caracteres com scanf

h

s ou S

Um byte – cadeia de caracteres com wscanf

h

s ou S

Cadeia de caracteres de caractere com ampla scanf

l

s ou S

Cadeia de caracteres de caractere com ampla wscanf

l

s ou S

O seguinte uso h e l exemplos de funções de scanf_s e funções de wscanf_s :

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

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

Cadeias de caracteres de Undelimited de leitura

Para ler as 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 de s (cadeia de caracteres). O conjunto de caracteres entre colchetes é referido como uma 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 é um sinal de intercalação (^), o efeito é invertido: O campo de entrada é lido até o primeiro caractere que aparece no restante do conjunto de caracteres.

Observe que %[a-z] e %[z-a] são interpretados como equivalente a %[abcde...z]. Esta é uma extensão comuns da função de scanf , mas observe que o padrão ANSI não a exige.

Ler cadeias de caracteres não terminado

Para armazenar uma cadeia de caracteres sem armazenar um caractere terminador nulo (\ “0 "), use a especificação %emc onde n é um inteiro decimal. Nesse caso, o caractere de tipo c indica que o argumento é um ponteiro para uma matriz de caractere. Os caracteres a seguir n são lidos do fluxo de entrada no local especificado, e nenhum caractere nulo (\ “0 ") é anexado. Se n não for especificado, o valor padrão é 1.

Quando o scanf parar de ler um campo

A função de scanf examinará cada campo de entrada, caractere por caractere. Pode parar de ler um campo de entrada específico antes de atingir um caractere de espaço por várias razões:

  • A largura especificada for atingido.

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

  • Os conflitos seguintes de caractere com um caractere no controle cadeia de caracteres que se suponha correspondente.

  • O próximo caractere não aparece em um conjunto de caracteres especificado.

Por qualquer motivo, quando a função de scanf de para ler um campo de entrada, o próximo campo de entrada é considerado iniciar no primeiro caractere não lidas. O caractere em conflito, se houver, é considerado não lidas e é o primeiro caractere do próximo campo de entrada ou o primeiro caractere em operações de leitura subsequentes no fluxo de entrada.

Consulte também

Referência

scanf, _scanf_l, wscanf, _wscanf_l

scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

Campos de especificação de formato: funções scanf e wscanf

Caracteres de campo de tipo scanf