Leia entrada do usuário para variáveis com scanf. Aprenda por que o & importa, a pegadinha do %lf e os bugs mais comuns.
scanf("%d", &x); lê para uma variável& antes da variável%lf (não %f!)fgets (mais seguro)printf manda texto para a tela, scanf lê a entrada do teclado. Eles são a imagem espelhada um do outro.printf("%d\n", a); // imprime a variável a na tela
scanf("%d", &a); // lê do teclado para a variável a
int a; printf("Enter a: "); // mensagem de prompt scanf("%d", &a); // lê a entrada printf("a = %d\n", a);
printf → ② ler com scanf → ③ usar o valor. Esse padrão de três passos é o arroz com feijão da E/S no console.& (e comercial) é obrigatórioscanf: coloque & antes de cada variável. Esquecer disso normalmente derruba o programa.&int a; scanf("%d", a); // ❌ esqueceu do &
& realmente é: o "endereço" da variávela guarda um valor. &a é o endereço de memória onde a mora.scanf precisa saber onde colocar o novo valor,&a).
& antes de variáveis no scanf e nunca no printf. (O printf só lê o valor — não precisa de endereço.) A mecânica completa é tratada em Fundamentos de Ponteiros.char name[50]; scanf("%s", name); // ← nada de & para nome de array
scanf, double usa %lf. É diferente do printf, e é uma fonte clássica de confusão.| Tipo | Especificador no scanf | Especificador no printf |
|---|---|---|
int | %d | %d |
float | %f | %f |
double | %lf ⚠️ | %f (%lf também funciona) |
char | %c | %c |
| string | %s | %s |
%f para um doubledouble b; scanf("%f", &b); // ❌ double precisa de %lf
b fica com um valor completamente errado (normalmente 0.0 ou algo enorme). É comportamento indefinido. Compile com -Wall para pegar isso.
%lf (o l vem de "long"). Só o scanf é chato com isso.scanf armazenaria.& faltandoscanf("%d", &a);& de fora normalmente derruba o programa%f para doublescanf("%lf", &b);scanf, double precisa de %lfscanf("%d\n", &a); ← não adicione \nscanf("Enter %d", &a); ← não embuta texto%c com outros especificadores.int a; double b; printf("Enter int: "); scanf("%d", &a); printf("Enter double: "); scanf("%lf", &b); // lf! printf("a=%d, b=%f\n", a, b);
scanf devolve a quantidade de itens lidos com sucesso, o que é útil para capturar entradas inválidas.int a; if (scanf("%d", &a) != 1) { printf("Please enter an integer\n"); return 1; }
& de propósito para ver o crash (é uma lição valiosa)%f e veja o valor ser corrompidoscanf("%d %d", &a, &b); para ler dois ints separados por espaçochar com %cchar s[50] com %s (ele para no espaço em branco)Teste seu entendimento desta aula!
int x;?O scanf precisa do endereço onde deve escrever o valor, então coloque & antes do nome da variável.
& é necessário nos argumentos do scanf?O scanf atualiza a variável de quem o chamou, então precisa de um ponteiro (um endereço) em vez do valor em si.
char name[50];?Nomes de array decaem para o endereço do primeiro elemento, então o & não é necessário. O %s lê uma única palavra até encontrar espaço em branco.