Codificar números é bom para uma primeira tentativa, mas o software real precisa reagir ao que as pessoas digitam. O trecho original usava constantes. É estático. Previsível. Tedioso.

Para tornar um programa útil, você precisa extrair dados do usuário em tempo de execução. Você faz isso com scanf. É a contrapartida de printf. Enquanto printf envia os dados para a tela, scanf os extrai do teclado.

Aqui está como você lida com a entrada inteira básica em C.

Capturando a entrada do usuário

Você não pode simplesmente declarar uma variável e esperar que ela retenha os dados do usuário magicamente. Você precisa pedir isso. Você também precisa informar ao computador onde armazenar esses dados. É por isso que scanf requer um ponteiro (o símbolo & ). Se você esquecer o E comercial, o programa irá travar ou gravar lixo na memória. Sempre inclua-o para tipos primitivos como int.

Considere esta lógica atualizada:

  1. Declarar variáveis para armazenar a entrada e o resultado.
  2. Avise ao usuário para que ele saiba o que digitar.
  3. Use scanf com o especificador de formato correto (%d para números inteiros).
  4. Realize o cálculo usando os valores armazenados.
  5. Produza o resultado misturando as variáveis ​​de entrada na string de impressão.

Por que isso é importante

A mudança de constantes para variáveis muda tudo. O programa não é mais um recorde quebrado. Ele se adapta. Você pode executá-lo uma vez com 5 e 7. Você pode executá-lo novamente com 100 e 200. A lógica permanece a mesma; os dados mudam.

Esta é a base dos aplicativos interativos CLI (Command Line Interface). Antes de poder construir ferramentas complexas, você precisa entender como inserir dados em suas variáveis ​​com segurança.

Principais conclusões

  • scanf precisa de um ponteiro: Sempre use o operador address-of (& ) antes do nome da sua variável em scanf.
  • Os especificadores de formato devem corresponder: Se você estiver lendo um int, você deve usar %d. Usar %f para um número inteiro causará um comportamento indefinido.
  • Os prompts são cruciais: Sem um prompt claro como “Insira o primeiro valor:”, o usuário fica olhando para um cursor piscando, imaginando se o programa está congelado. Não é. Está apenas esperando.

O código funciona. É simples. Mas é funcional. Você mudou de um script estático para uma ferramenta dinâmica. A próxima etapa geralmente é o tratamento de erros. O que acontece se o usuário digitar “olá” em vez de um número? scanf irá falhar silenciosamente, deixando suas variáveis ​​não inicializadas. Isso é um problema para outro dia.

Por enquanto, você tem um programa que realmente escuta.

Entrada, saída e regras de engajamento

Você fez as edições. Agora compile. Execute-o. Se travar, não entre em pânico. Provavelmente faltou um pequeno detalhe de sintaxe.

Pegue scanf. Ele imita printf no uso de strings de formato. Digite man scanf se precisar das letras miúdas. Mas preste atenção ao e comercial (& ) antes de variáveis ​​como a e b.

Este é o operador de endereço.

Ele retorna o endereço de memória da variável. Pode parecer confuso agora. Os ponteiros esclarecerão isso mais tarde. Mas por enquanto, siga a regra: se você estiver usando scanf em um char, int ou float, você precisa do &. Você também precisa disso para estruturas.

Ignorar o &? Você receberá um erro em tempo de execução. Quebre-o intencionalmente. Veja o que acontece. É a única maneira de lembrar por que isso é importante.

Formatando a saída com precisão

Vamos dissecar printf. Comece simples.

printf("Olá");

Isso envia a palavra “Hello” para a saída padrão. Nada mais. Sem nova linha. O cursor fica logo após o “o”.

Agora adicione uma nova linha.

printf("Olá\n");

O \n aciona um retorno de carro. A saída termina em sua própria linha. Esta é a expectativa padrão para uma saída limpa do console.

Variáveis ​​requerem espaços reservados. Para imprimir o valor de b :

printf("%d",b);

O %d é um espaço reservado. Quando o código é executado, printf o troca pelo valor inteiro real de b.

Você pode incorporar valores em frases. Você poderia encadear várias chamadas:

printf("A temperatura é "); printf("%d",b); printf("graus\n");

Mas isso é tedioso. A abordagem mais limpa os combina em uma string de formato:

printf("A temperatura é %d graus\n", b);

Vários valores também funcionam.

printf("%d + %d = %d\n", a, b, c);

Aqui está a armadilha. O número de espaços reservados na string de formato deve corresponder ao número de variáveis ​​que a seguem. Exatamente.

Se você tiver três tags %d, precisará de três parâmetros. Os tipos devem corresponder. A ordem deve corresponder. Incompatibilidade com isso? A saída será lixo. Ou pior, ele irá falhar.

Correspondendo tipos a espaços reservados

printf lida com a maioria dos tipos C padrão. Você só precisa do código certo.

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

Para nuances mais profundas, verifique man 3 printf em um sistema UNIX. Seu compilador específico provavelmente terá um manual ou arquivo de ajuda que cobre casos extremos.

Armadilhas Comuns

Novos desenvolvedores tropeçam nisso repetidamente.

A distinção entre maiúsculas e minúsculas é estrita. printf está em letras minúsculas. Printf ou PRINTF falhará.

scanf exige o operador de endereço (& ). Esqueça e o programa não armazenará sua entrada corretamente.

A contagem de parâmetros é importante. Muitos ou poucos argumentos em printf ou scanf levam a um comportamento indefinido.

A declaração vem antes do uso. Você não pode usar um nome de variável em C sem declará-lo primeiro. O compilador precisa conhecer o layout e o tipo da memória de antemão.

O compilador não adivinha. Ele impõe.