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.
- O programa solicita o primeiro número inteiro.
scanfaguarda entrada.- O usuário digita um número e pressiona Enter.
- O valor é armazenado em
a. - Repita para
b. - Adicione-os.
- 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:
printfusa o valor.scanfprecisa 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
&emscanfcausa falhas no tempo de execução. - Contagens de parâmetros incompatíveis em
printfouscanfcorrompem 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.
































