Scanf descrição da função C
Scanf descrição da função C

Vídeo: Scanf descrição da função C

Vídeo: Scanf descrição da função C
Vídeo: Tudo o que você precisa saber antes de ir para a Turquia (dicas e curiosidades) 2024, Maio
Anonim

Neste artigo, a função scanf() é considerada de forma geral sem referência a um padrão específico, portanto, os dados de qualquer padrão C99, C11, C++11, C++14 são incluídos aqui. Talvez, em alguns padrões, a função funcione com diferenças do material apresentado no artigo.

scanf função C - descrição

scanf() é uma função localizada nos arquivos de cabeçalho stdio.h(C) e cstdio(C++), também conhecido como entrada de programa formatada. scanf lê os caracteres do fluxo de entrada padrão (stdin) e os converte de acordo com o formato, depois os grava nas variáveis especificadas. Formato - significa que os dados são convertidos para um determinado formato após o recebimento. Assim, a função scanf C é descrita:

scanf("%format", &variable1[, &variable2, […]), onde as variáveis são passadas como endereços. A razão dessa forma de passar variáveis para uma função é óbvia: como resultado do trabalho, ela retorna um valor que indica a presença de erros, entãoa única forma de alterar os valores das variáveis é passando por endereço. Além disso, graças a este método, a função pode processar dados de qualquer tipo.

Alguns programadores referem-se a funções como scanf() ou printf() como procedimentos por causa da analogia com outras linguagens.

Scanf permite a entrada de todos os tipos básicos de linguagem: char, int, float, string, etc. No caso de variáveis do tipo string, não há necessidade de especificar o sinal de endereço - "&", pois a variável do tipo string é um array, e seu nome é o endereço do primeiro elemento do array na memória do computador.

Usando C em C++
Usando C em C++

Formato de entrada de dados ou string de controle

Comece olhando o exemplo da função scanf C da descrição.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); retornar 0; //requisito para sistemas linux }

O formato de entrada consiste nos quatro parâmetros a seguir: %[width][modifiers] type. Neste caso, o sinal "%" e o tipo são parâmetros obrigatórios. Ou seja, o formato mínimo é assim: “%s”, “%d” e assim por diante.

Em geral, os caracteres que compõem a string de formato são divididos em:

  • especificadores de formato - qualquer coisa que comece com %;
  • caracteres de separação ou espaço - eles são espaço, tabulação(t), nova linha (n);
  • caracteres que não sejam espaços em branco.

A função pode não ser segura.

Use scanf_s() em vez de scanf().

(mensagem do Visual Studio)

Tipo, ou especificadores de formato, ou caracteres de conversão, ou caracteres de controle

Código binário
Código binário

Uma declaração scanf C deve conter pelo menos um especificador de formato, que é especificado no final das expressões que começam com "%". Ele informa ao programa o tipo de dados a serem esperados ao inserir, geralmente a partir do teclado. Lista de todos os especificadores de formato na tabela abaixo.

Tipo Significado
1

%c

O programa está aguardando a entrada de um caractere. A variável a ser escrita deve ser do tipo caractere char.
2 %d O programa espera a entrada de um número decimal do tipo inteiro. A variável deve ser do tipo int.
3 %i O programa espera a entrada de um número decimal do tipo inteiro. A variável deve ser do tipo int.
4 %e, %E O programa espera inserir um número de ponto flutuante (vírgula) na forma exponencial. A variável deve ser do tipo float.
5 %f O programa espera um número de ponto flutuante (vírgula). A variável deve ser do tipo float.
6 %g, %G O programa espera um número de ponto flutuante (vírgula). A variável deve ser do tipo float.
7 %a O programa espera um número de ponto flutuante (vírgula). A variável deve ser do tipo float.
8 %o O programa espera um número octal. A variável deve ser do tipo int.
9 %s O programa está esperando que uma string seja inserida. Uma string é um conjunto de quaisquer caracteres até o primeiro caractere separador encontrado. A variável deve ser do tipo string.
10 %x, %X O programa está aguardando um número hexadecimal. A variável deve ser do tipo int.
11 %p Variável espera entrada de ponteiro. A variável deve ser do tipo ponteiro.
12 %n Escreve em uma variável um valor inteiro igual ao número de caracteres lidos até agora pela função scanf.

13

%u O programa lê um inteiro sem sinal. O tipo de variável deve ser inteiro sem sinal.
14 %b O programa está esperando por um número binário. A variável deve ser do tipo int.
15 % Conjunto de caracteres digitalizados. O programa está esperando que os caracteres sejam inseridos.do pool limitado especificado entre colchetes. scanf funcionará enquanto houver caracteres do conjunto especificado no fluxo de entrada.
16 %% Sinal "%".

Caracteres no formato string

Código C++
Código C++

Símbolo de estrela ()

O asterisco () é um sinalizador que indica que a operação de atribuição deve ser suprimida. Um asterisco é colocado imediatamente após o sinal "%". Por exemplo,


scanf("%d%c%d", &x, &y); //ignora caractere entre dois inteiros. scanf("%s%d%s", str, str2); //ignora inteiro entre duas strings.

Ou seja, se você digitar a linha "45-20" no console, o programa fará o seguinte:

  1. Variável "x" receberá o valor 45.
  2. A variável "y" receberá o valor 20.
  3. E o sinal de menos (traço) "-" será ignorado graças a "%c".

Largura (ou largura do campo)

Este é um número inteiro entre o sinal "%" e o especificador de formato que especifica o número máximo de caracteres a serem lidos na operação de leitura atual.


scanf("%20s", str); // lê os primeiros 20 caracteres do fluxo de entrada

Há algumas coisas importantes a serem lembradas:

  1. scanf terminará se encontrar um caractere separador, mesmo que não conte 20 caracteres.
  2. Se mais de 20 caracteres forem inseridos, apenas os primeiros 20 caracteres serão gravados em str.

Modificadorestipo (ou precisão)

código inicial
código inicial

São sinalizadores especiais que modificam o tipo de dado esperado para entrada. O sinalizador é especificado à esquerda do especificador de tipo:

  • L ou l (L pequeno) Quando "l" é usado com os especificadores d, i, o, u, x, o sinalizador informa ao programa que a entrada long int é esperada. Ao usar "l" com o especificador e ou f, o sinalizador informa ao programa que ele deve esperar um valor double. O uso de "L" informa ao programa que um longo duplo é esperado. O uso de "l" com os especificadores "c" e "s" informa ao programa que caracteres de dois bytes como wchar_t são esperados. Por exemplo, "%lc", "%ls", "%l[asd]".
  • h é um sinalizador que indica o tipo curto.
  • hh - indica que a variável é um ponteiro para um valor de caractere com sinal ou caractere sem sinal. O sinalizador pode ser usado com os especificadores d, i, o, u, x, n.
  • ll (dois L's pequenos) - indica que a variável é um ponteiro para um valor do tipo assinado long long int ou unsigned long long int. O sinalizador é usado com especificadores: d, i, o, u, x, n.
  • j - indica que a variável é um ponteiro para o tipo intmax_t ou uintmax_t do arquivo de cabeçalho stdint.h. Usado com especificadores: d, i, o, u, x, n.
  • z - indica que a variável é um ponteiro para o tipo size_t, cuja definição está em stddef.h. Usado com especificadores: d, i, o, u, x, n.
  • t - indica que a variável é um ponteiro para o tipo ptrdiff_t. Definição ativadaeste tipo está em stddef.h. Usado com especificadores: d, i, o, u, x, n.

Mais claramente, a imagem com modificadores pode ser representada como uma tabela. Essa descrição do scanf C para programadores será mais clara.

Especificadores e modificadores de tipo
Especificadores e modificadores de tipo

Outros caracteres

Quaisquer caracteres encontrados no formato serão descartados. Ao mesmo tempo, deve-se notar que a presença de espaços em branco ou caracteres separadores (nova linha, espaço, tabulação) na string de controle pode levar a um comportamento diferente da função. Em uma versão, scanf() lerá sem salvar qualquer número de separadores até encontrar um caractere diferente do separador e, em outra versão, os espaços (somente eles) não desempenham um papel e a expressão "%d + %d" é equivalente a "% d+%d".

Exemplo de código C++
Exemplo de código C++

Exemplos

Vamos ver alguns exemplos para ajudá-lo a pensar e entender melhor como a função funciona.


scanf("%3s", str); //se você digitar a string "1d2s3d1;3" no console, apenas "1d2" será escrito em str scanf("%dminus%d", &x, &y); //caracteres menos entre dois números serão descartados scanf("%5[0-9]", str); // caracteres serão inseridos em str até que haja 5 caracteres e os caracteres sejam números de 0 a 9. scanf("%lf", &d); //espera entrada dupla scanf("%hd", &x); //número esperado do tipo short scanf("%hu", &y); //espera um número sem sinal short scanf("lx", &z); //número esperado do tipo long int

DeOs exemplos abaixo mostram como o número esperado muda usando diferentes símbolos.

scanf C - descrição para iniciantes

Esta seção será útil para iniciantes. Muitas vezes você precisa ter em mãos não tanto uma descrição completa do scanf C quanto os detalhes de como a função funciona.

  • Este recurso é um pouco obsoleto. Existem várias implementações diferentes em bibliotecas de diferentes versões. Por exemplo, a função scanf S C aprimorada, cuja descrição pode ser encontrada no site da Microsoft.
  • O número de especificadores no formato deve corresponder ao número de argumentos passados para a função.
  • Os elementos do fluxo de entrada devem ser separados apenas por caracteres separadores: espaço, tabulação, nova linha. Vírgula, ponto e vírgula, ponto, etc. - esses caracteres não são separadores para a função scanf().
  • Se scanf encontrar um caractere separador, a entrada será interrompida. Se houver mais de uma variável para ler, o scanf passará para a leitura da próxima variável.
  • A menor inconsistência no formato dos dados de entrada leva a resultados imprevisíveis do programa. Bem, se o programa apenas terminar com um erro. Mas muitas vezes o programa continua funcionando e faz tudo errado.
  • scanf("%20s …", …); Se o fluxo de entrada exceder 20 caracteres, o scanf lerá os primeiros 20 caracteres e abortará ou passará para a leitura da próxima variável, se uma for especificada. Nesse caso, a próxima chamada para scanf continuará lendo o fluxo de entrada a partir do ponto em que o trabalho da chamada anterior para scanf parou. Se ao ler os primeiros 20caracteres, um caractere delimitador for encontrado, o scanf abortará ou continuará lendo a próxima variável, mesmo que não tenha lido 20 caracteres para a primeira variável. Neste caso, todos os caracteres não lidos serão anexados à próxima variável.
  • Se o conjunto de caracteres digitalizados começar com um "^", então o scanf lerá os dados até encontrar um caractere delimitador ou um caractere do conjunto. Por exemplo, "%[^A-E1-5]" lerá dados do fluxo até que um dos caracteres maiúsculos em inglês de A a E ou um dos números de 1 a 5 seja encontrado.
  • A função scanf C, conforme descrito, retorna um número igual ao número bem-sucedido de gravações em variáveis. Se scanf escrever 3 variáveis, então o resultado de sucesso da função retornará o número 3. Se scanf não puder escrever nenhuma variável, então o resultado será 0. E, finalmente, se scanf não puder iniciar por algum motivo, o o resultado será EOF.
  • Se a função scanf() terminou incorretamente. Por exemplo, scanf("%d", &x) - um número era esperado, mas os caracteres foram recebidos como entrada. A próxima chamada scanf() começará no ponto no fluxo de entrada onde a chamada de função anterior terminou. Para superar esse problema, é necessário se livrar dos personagens problemáticos. Isso pode ser feito, por exemplo, chamando scanf("%s"). Ou seja, a função lerá uma string de caracteres e a jogará fora. Dessa maneira complicada, você pode continuar inserindo os dados necessários.
  • Em algumas implementações de scanf(), "-" não é permitido no conjunto de caracteres digitalizados.
  • O especificador "%c" lê cada caractere do fluxo. Ou seja, também lê o caractere separador. Para pular o caractere delimitador e continuar lendo o caractere desejado, você pode usar "%1s".
  • Ao usar o especificador "c", é permitido usar a largura "%10c", mas então um array de elementos do tipo char deve ser passado como uma variável para a função scanf.
  • “%[a-z]” significa “todas as letras minúsculas do alfabeto inglês” e “%[z-a]” significa apenas 3 caracteres: ‘z’, ‘a’, ‘-’. Em outras palavras, o caractere "-" significa um intervalo apenas se estiver entre dois caracteres que estão na ordem correta. Se "-" estiver no final de uma expressão, no início ou na ordem errada de caracteres em ambos os lados, então é apenas um caractere de hífen, não um intervalo.
Código C++
Código C++

Conclusão

Isso conclui a descrição do scanf C. Este é um recurso útil para trabalhar em pequenos programas e ao usar o método de programação procedural. No entanto, a principal desvantagem é o número de erros imprevisíveis que podem ocorrer ao usar scanf. Portanto, é melhor manter a descrição de scanf C ao programar na frente de seus olhos. Em grandes projetos profissionais, os iostreams são usados, pois possuem recursos de nível superior, são mais capazes de capturar e lidar com erros e também trabalhar com quantidades significativas de informações. Deve-se notar também que a descrição do scanf C em russo está disponível em muitas fontes de rede, bem como exemplos dissouso, devido à idade da função. Portanto, se necessário, você sempre pode encontrar a resposta nos fóruns temáticos.

Recomendado: