Entrada de cadenas con scanf
Parte de la sección Logic & Flow del Journey de C de Coddy — lección 14 de 63.
Ahora que entiendes cómo funcionan las cadenas con el terminador nulo, es hora de aprender cómo obtener la entrada de cadenas de los usuarios. La función scanf puede leer cadenas usando el especificador de formato %s, pero tiene limitaciones importantes que debes entender.
Para leer una cadena con scanf, se utiliza el formato %s y se pasa el nombre del arreglo de caracteres (sin el operador &, ya que los nombres de los arreglos ya son direcciones):
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);Sin embargo, scanf("%s", ...) tiene una limitación crítica: deja de leer tan pronto como encuentra cualquier carácter de espacio en blanco (espacio, tabulación o salto de línea). Esto significa que si un usuario escribe "Hello World", scanf solo capturará "Hello" y dejará "World" en el búfer de entrada.
Otra preocupación seria es que scanf no comprueba si la entrada cabe en tu array. Si alguien introduce una palabra más larga de lo que tu array puede contener, causará un desbordamiento de búfer, lo que podría bloquear tu programa o crear vulnerabilidades de seguridad. Asegúrate siempre de que tu array de caracteres sea lo suficientemente grande para la entrada esperada.
A pesar de estas limitaciones, scanf("%s", ...) es perfectamente adecuado para leer palabras sueltas, que es exactamente lo que practicarás en el próximo desafío.
Desafío
FácilEscribe un programa en C que demuestre la lectura de entrada de cadenas del usuario utilizando scanf y mostrándola de vuelta. Tu programa debe:
- Declarar un arreglo de caracteres llamado
usernamecon 30 elementos para almacenar la entrada del usuario - Declarar un arreglo de caracteres llamado
hobbycon 25 elementos para almacenar otra entrada - Usar
printfpara solicitar al usuario con el mensaje "Enter your username:" - Usar
scanfcon el especificador de formato%spara leer el nombre de usuario en el arreglousername - Usar
printfpara solicitar al usuario con el mensaje "Enter your hobby:" - Usar
scanfcon el especificador de formato%spara leer el pasatiempo en el arreglohobby - Imprimir ambas cadenas usando
printfen el formato exacto que se muestra a continuación
La entrada se proporcionará como dos palabras individuales separadas (sin espacios dentro de cada palabra).
Tu salida debe mostrar los resultados en el siguiente formato:
Enter your username:
Enter your hobby:
Hello [username], your hobby is [hobby]!Por ejemplo, si el usuario ingresa "Alice" como nombre de usuario y "reading" como pasatiempo, la salida debe ser:
Enter your username:
Enter your hobby:
Hello Alice, your hobby is reading!Este desafío pone a prueba tu comprensión del uso de scanf con el especificador de formato %s para leer la entrada de cadenas, la declaración adecuada de arreglos de caracteres con el tamaño suficiente y la combinación de la entrada del usuario con la salida formateada usando printf.
Hoja de referencia
Para leer la entrada de cadenas de los usuarios, use scanf con el especificador de formato %s:
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);Limitaciones importantes de scanf("%s", ...):
- Deja de leer en cualquier carácter de espacio en blanco (espacio, tabulación, salto de línea)
- Solo captura palabras sueltas: "Hello World" se convierte solo en "Hello"
- Sin protección contra desbordamiento de búfer: asegúrese de que su array sea lo suficientemente grande
- No use el operador
&con nombres de arrays (ya son direcciones)
Pruébalo tú mismo
#include <stdio.h>
int main() {
// TODO: Declara tus arreglos de caracteres aquí
// TODO: Escribe tu código aquí para solicitar y leer la entrada
// TODO: Imprime el mensaje de salida final
return 0;
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Fundamentos de Punteros
¿Qué es un puntero?Declaración de punterosEl operador de dirección (&)El operador de desreferencia (*)Punteros NULLResumen: Conceptos básicos de punteros4Proyecto: Utilidad de texto simple
Descripción general del proyectoContar caracteres2Punteros y Arrays
Nombres de Arrays como PunterosElementos de un Array - PunterosAritmética de PunterosComparación de PunterosResumen: Recorrido de Arrays con Punteros5Punteros y funciones
Paso por valorPasar punteros a funcionesModificar variables mediante punterosUn ejemplo clásico: Intercambio (Swap)Pasar arrays a funcionesResumen: Argumentos de punteros a funciones3Arreglos de caracteres y cadenas
Cadenas como arreglos de charEl terminador nuloEntrada de cadenas con scanfUso de strlen()Uso de strcpy()Uso de strcat()Uso de strcmp()Resumen: Funciones básicas de cadenas