Menu
Coddy logo textTech

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.

challenge icon

Desafío

Fácil

Escribe un programa en C que demuestre la lectura de entrada de cadenas del usuario utilizando scanf y mostrándola de vuelta. Tu programa debe:

  1. Declarar un arreglo de caracteres llamado username con 30 elementos para almacenar la entrada del usuario
  2. Declarar un arreglo de caracteres llamado hobby con 25 elementos para almacenar otra entrada
  3. Usar printf para solicitar al usuario con el mensaje "Enter your username:"
  4. Usar scanf con el especificador de formato %s para leer el nombre de usuario en el arreglo username
  5. Usar printf para solicitar al usuario con el mensaje "Enter your hobby:"
  6. Usar scanf con el especificador de formato %s para leer el pasatiempo en el arreglo hobby
  7. Imprimir ambas cadenas usando printf en 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;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Logic & Flow