Como ler a entrada do usuário em C com scanf

8

Constantes são convenientes. Eles são estáticos. Mas eles também são chatos.

Um programa que sempre soma 5 e 7 faz exatamente uma coisa. Não se adapta. Não interage. Para tornar o código C realmente útil para os usuários finais, você precisa parar de codificar os valores e começar a ouvir.

A ferramenta para esse trabalho é scanf.

De codificado para dinâmico

No exemplo anterior, as variáveis a e b provavelmente foram inicializadas com números fixos. A lógica era rígida. O resultado era previsível. Se você quisesse alterar a adição, teria que editar o código-fonte, recompilar e executá-lo novamente.

Isso não é fácil de usar.

Para corrigir isso, precisamos capturar a entrada do console. A biblioteca padrão lida com saída (printf ) e entrada (scanf ). A mudança de constantes para valores definidos pelo usuário transforma o programa de uma demonstração de calculadora em um utilitário simples.

A sintaxe do scanf

Aqui está o código que faz isso acontecer:

A lógica é direta. É linear.

  1. O programa solicita o primeiro número inteiro.
  2. scanf aguarda entrada.
  3. O usuário digita um número e pressiona Enter.
  4. O valor é armazenado em a.
  5. Repita para b.
  6. Adicione-os.
  7. Imprima o resultado.

A confusão do E comercial (&)

O ponto de falha mais comum para iniciantes aqui é o símbolo &.

Veja esta linha:
scanf("%d", &a);

Por que existe um e comercial? Por que não apenas scanf("%d", a);?

Variáveis ​​em C não são apenas nomes. Eles são endereços de memória. Ao declarar int a, você está reservando um pedaço de RAM. scanf não deseja o valor de a porque a está atualmente vazio (ou contém lixo). scanf precisa do endereço onde pode escrever o novo valor.

O & é o operador “endereço de”. Ele fornece ao scanf a localização na memória para que possa modificar a diretamente. Sem ele, você está apontando scanf para um pedaço aleatório de memória. O programa provavelmente irá travar ou, pior, corromper seus dados.

Insight principal: printf usa o valor. scanf precisa do endereço.

Especificadores de formato

Você usou %d em printf para exibir um número inteiro. Você deve usar %d em scanf para ler um.

A incompatibilidade entre eles causa um comportamento indefinido. Se você tentar ler um número inteiro usando %f (float), os dados serão interpretados incorretamente. O layout da memória de um float é diferente de um inteiro. scanf escreverá os bits brutos de um float

Como scanf e printf tratam variáveis em C

Compilar e executar o código é onde a teoria encontra a realidade. Se você pular esta etapa, estará apenas adivinhando. A função scanf opera de forma semelhante a printf em relação a strings de formato, mas tem um requisito mais rigoroso para entrada. Você deve colocar o operador de endereço (& ) antes de variáveis ​​do tipo char, int, float e estruturas. Sem ele, o programa trava.

Por que o scanf requer o operador de endereço

O e comercial não é opcional. Diz ao compilador para armazenar a entrada diretamente no local de memória da variável. Se você omiti-lo, você acionará um erro de tempo de execução. Você deve tentar removê-lo intencionalmente. Ver o acidente é mais educativo do que ler sobre ele. Isso mostra exatamente o quão frágil o C pode ser quando os endereços de memória são mal gerenciados.

Como o printf formata a saída para os usuários

printf envia texto para a saída padrão. A versão mais simples fica assim:

Isso imprime a palavra “Hello” sem nova linha. Compare isso com:

O \n adiciona um retorno de carro. Termina a linha. Sem ele, a próxima saída aparece na mesma linha. É um pequeno detalhe que prejudica a legibilidade se for ignorado.

Como incorporar variáveis em strings printf

Para gerar o valor de uma variável, você usa um espaço reservado. O operador %d substitui-se pelo valor inteiro da variável. Considere este exemplo:

Você pode encadear chamadas printf separadas para misturar texto e variáveis, mas é ineficiente:

A abordagem mais limpa incorpora o espaço reservado na string:

Vários espaços reservados também funcionam:

O número de espaços reservados deve corresponder exatamente ao número de variáveis. Os tipos também devem corresponder. Três especificadores %d requerem três parâmetros int na mesma ordem. Tipos ou contagens incompatíveis levam a um comportamento indefinido.

Quais espaços reservados lidam com diferentes tipos de C

printf suporta tipos C padrão através de especificadores de formato específicos:

  • int usa %d
  • float usa %f
  • char usa %c
  • sequências de caracteres use %s

Você pode encontrar documentação detalhada digitando man 3 printf em uma máquina UNIX. Outros compiladores fornecem páginas de manual ou arquivos de ajuda semelhantes.

Erros comuns de C a serem evitados

A distinção entre maiúsculas e minúsculas é estrita. Printf ou PRINTF falhará. Deve ser printf minúsculo.

  • Esquecer o & em scanf causa falhas no tempo de execução.
  • Contagens de parâmetros incompatíveis em printf ou scanf corrompem a saída.
  • O uso de variáveis ​​não declaradas resulta em erros de compilação.

A depuração desses problemas geralmente se resume a verificar primeiro a sintaxe. O compilador geralmente dirá exatamente onde está a incompatibilidade. Você apenas precisa ler a mensagem de erro.