Lección 5 · 5 de 20
Leer datos con scanf · C
Pida datos al usuario en C con scanf: palabras con %s, enteros con %d y decimales con %lf, y compruebe cuántos valores se han leído.

`scanf` es lo contrario de printf: lee del teclado según un formato y guarda lo leído en variables. Como necesita saber dónde guardarlo, a los números se les pone & delante: scanf("%d", &age). Qué significa exactamente ese & lo verá en la lección de punteros.
char name[30] reserva sitio para un texto (en la lección 11 verá los textos a fondo). %29s lee una palabra, como mucho de 29 letras, para dejar sitio al final del texto; a los textos no se les pone &.
Ojo con los double: en scanf se leen con `%lf`, aunque en printf se escriban con %f. Un formato puede leer varios valores a la vez: "%d %d" lee dos enteros de la misma línea, y scanf devuelve cuántos ha conseguido leer, aquí 2. Si alguien escribe una letra en vez de un número, devolvería menos, y así puede comprobarlo.
Aquí las respuestas salen del archivo input.txt, como si alguien las tecleara, por eso no aparecen en la salida: solo se ven las preguntas y lo que contesta el programa. En la consola de DMarlon Studio, tras pulsar F9, puede escribirlas usted mismo.
Código · main.c
#include <stdio.h>int main(void) { char name[30]; // room for a word of up to 29 letters int age; double price; int adults, children; // %s reads one word. Text needs no &. printf("What is your name? "); scanf("%29s", name); printf("Nice to meet you, %s!\n", name); // For numbers, &age tells scanf where to store the value. printf("How old are you? "); scanf("%d", &age); printf("In 10 years you will be %d.\n", age + 10); // %lf reads a double (printf writes it with just %f). printf("Price of a cinema ticket? "); scanf("%lf", &price); printf("One ticket: %.2f euros.\n", price); // Two numbers on one line; scanf returns how many it read. printf("Adult and child tickets? "); int read = scanf("%d %d", &adults, &children); printf("(scanf read %d numbers)\n", read); // Children pay half price. double total = price * adults + price / 2 * children; printf("%d tickets cost %.2f euros.\n", adults + children, total); return 0;}Entrada (lo que se teclea) · input.txt
Lucia 29 8.50 2 1
Salida · cc main.c -o main && ./main
What is your name? Nice to meet you, Lucia! How old are you? In 10 years you will be 39. Price of a cinema ticket? One ticket: 8.50 euros. Adult and child tickets? (scanf read 2 numbers) 3 tickets cost 21.25 euros.
Para recordar
scanflee con el mismo tipo de formatos queprintf.- Los números llevan
&:scanf("%d", &n). - Un
doublese lee con%lf. %29slee una palabra sin pasarse del tamaño.scanfdevuelve cuántos valores ha leído.
Ejercicio
Pida también el número de la sala con %d y escriba al final «Room 4: 3 tickets cost 21.25 euros.». Añada la respuesta a input.txt.