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

7

Constantes são rígidas. Eles não mudam. A vida não é assim, e seus programas de teste também não deveriam ser. Se você está aprendendo C, números codificados como 5 e 7 envelhecem rapidamente. Você quer interação. Você quer que o computador espere que você digite algo.

Digite scanf.

É a outra metade da história do printf. Enquanto printf envia dados para a tela, scanf extrai dados do teclado. Não é a ferramenta mais robusta da biblioteca padrão C, mas para uma entrada simples no console, ela realiza o trabalho sem a necessidade de dependência de terceiros.

Veja como você pega um script estático e o torna dinâmico.

O Código

Copie isso. Execute-o. Digite números quando solicitado.

Quebrando scanf

A mágica acontece nestas duas linhas:

scanf("%d", &a);

  • scanf : O nome da função. Abreviação de “entrada formatada para digitalização”.
  • "%d" : O especificador de formato. Diz ao scanf para esperar um número inteiro. Se você estivesse lendo um float, você usaria "%f".
  • &a : Esta é a parte crítica. Você não está passando o valor de a. Você está passando o endereço de a.

Pense desta forma: printf precisa saber o que está dentro da variável. scanf precisa saber onde colocar os dados. O operador & fornece esse endereço de memória. Ignore o e comercial e você travará. Ou pior, você receberá um aviso que parece algo sem sentido e uma variável que não muda.

Como funciona na prática

Ao executar o programa:

  1. O terminal imprime: Digite o primeiro valor:
  2. O cursor pisca. Isso espera. Você fica preso aqui até digitar algo e pressionar Enter.
  3. Você digita 5. Você bateu Enter.
  4. scanf pega aquele 5, converte a string de caracteres “5” no valor inteiro 5 e armazena-o no endereço de memória &a.
  5. O mesmo loop acontece para o segundo valor.

Depois vem a matemática. c = a + b;. Adição simples.

Finalmente, printf exibe o resultado. Mas observe a string de formato: printf("%d + %d = %d\n", a, b, c);. Você está injetando as variáveis ​​de volta na string. É assim que você cria uma saída legível.

Por que isso é importante

A maioria dos aplicativos modernos não usa entrada de console. Você não digita comandos em uma caixa preta para seu navegador ou editor de fotos. Mas compreender esse fluxo é fundamental.

Entrada -> Processo -> Saída.

Esse é o ciclo básico de todo software. `

Como o scanf lida com endereços de memória

Quando você executa esse código, a diferença entre sucesso e falha no tempo de execução se resume a um caractere. Especificamente, o e comercial (& ) antes das variáveis ​​a e b.

Este é o operador de endereço. Ele informa ao scanf exatamente onde armazenar a entrada que recebe na memória. Sem ele, scanf não sabe a localização da variável. Ele apenas obtém um valor, que é inútil para armazenar dados de volta no programa. Se você omitir, o programa não será compilado ou travará imediatamente após a execução. Você precisa deste operador para char, int, float e tipos de estrutura.

Tente removê-lo. Observe o que acontece. É uma lição dolorosa, mas necessária, sobre como C gerencia a memória.

Dominando a saída printf

printf é a sua janela para o usuário. Ele envia dados para a saída padrão. A versão mais simples é direta.

Isso imprime a palavra Olá. Nada mais. Sem quebra de linha. O cursor fica logo após o ‘o’.

Adicione um caractere de nova linha.

Agora a saída passa para a próxima linha. O \n é um retorno de carro. É essencial para uma saída legível do console.

Variáveis ​​mudam o jogo. Você não pode simplesmente imprimir o nome de uma variável como faz em Python ou JavaScript. Você deve usar um espaço reservado.

O %d é um espaço reservado. Ele é substituído pelo valor inteiro de b em tempo de execução. É assim que C lida com a saída dinâmica.

Você pode misturar texto e variáveis. Uma maneira desajeitada é encadear várias impressões.

Funciona. Também é detalhado. A abordagem mais limpa incorpora tudo em uma string.

Vários valores também funcionam. Basta manter os espaços reservados alinhados com os argumentos.

A ordem é importante. O primeiro %d mapeia para a. O segundo para b. O terceiro para c. Se você trocá-los, a matemática estará errada. Se você perder um, o comportamento será indefinido. O número e o tipo de operadores na string de formato devem corresponder exatamente aos parâmetros.

Espaços reservados específicos do tipo

C é rigoroso quanto aos tipos. Você não pode usar o mesmo espaço reservado para tudo. Você deve corresponder o tipo de dados ao especificador de formato.

  • Use %d para int (valores inteiros).
  • Use %f para float (números de ponto flutuante).
  • Use %c para char (caracteres únicos).
  • Use %s para sequências de caracteres (matrizes de caracteres).

Se você usar %d para um float, você obterá uma saída lixo. Se você usar %s para um int, o programa provavelmente travará. A precisão não é opcional aqui.

Para obter detalhes mais profundos sobre esses especificadores, consulte o manual do UNIX. Digite man 3 printf. Outros compiladores fornecem documentação semelhante. Vale a pena ler.

Armadilhas comuns a serem evitadas

Compiladores C são úteis, mas não são leitores de mentes. Você cometerá erros. Veja como evitar os mais comuns.

  1. Diferenciação de maiúsculas e minúsculas : C diferencia maiúsculas de minúsculas. Printf ou PRINTF falhará. Deve ser printf. O mesmo se aplica a nomes de variáveis ​​e chamadas de funções.
  2. Falta o operador de endereço : Esquecer o & em scanf é um erro frequente. Isso causa falha imediata no tempo de execução. Sempre inclua-o para tipos primitivos.
  3. Parâmetros incompatíveis : Muitos ou poucos argumentos em printf ou scanf levam a erros. A string de formato determina a estrutura. Atenha-se a isso.
  4. Variáveis ​​não declaradas : Você deve declarar uma variável antes de usá-la. C não infere tipos. Você define int a; antes de imprimir a.

Esses erros são repetitivos. Eles também são fáceis de corrigir quando você reconhece o padrão.