TransWikia.com

Escribir 2 valores en un 1er scanf y el 2do scanf no sea saltado en C

Stack Overflow en español Asked by plazamarco on November 22, 2021

Si en el primer scanf coloco dos valores ejemplo "Marco Antonio" separados por un espacio automáticamente el 2do scanf no me pregunta nada y me toma como valor introducido el "Antonio".

¿Como hago para por lo menos evitar eso?

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    system("clear");
    
    char apellido[30], 
         nombre[30];

    printf("Nombre: ");
    scanf("%30s", nombre);
    printf("Apellido: ");
    scanf("%30s", apellido);

    printf("Mi nombre es %s y mi apellido es %s. n", nombre, apellido);

    return 0;
}

2 Answers

La entrada estándar en C funciona de la siguiente manera:

  • La entrada es bloqueante, es decir, el programa se detiene hasta que hay algo que leer.
  • Se entiende que hay algo que leer cuando en el buffer de entrada se introduce un salto de línea.

Lo que sucede en este código es que, ante la entrada "Marco Antonion" el programa no sale del primer scanf hasta que no se ha introducido el salto de línea... entonces empieza a leer y procesa la primera palabra "Marco", después le llega el turno al segundo scanf que ve que sigue habiendo contenido en el buffer... y es cuando procesa la segunda palabra "Antonio" y elimina el salto de línea, por lo que un tercer scanf se quedaría esperando a que el usuario introdujese nuevos valores.

¿Como hago para por lo menos evitar eso?

Pues depende:

  • Si tu idea es que tanto el nombre como el apellido puedan tener espacios tendrás que configurar scanf de forma diferente:

      scanf("%[^n]%*c", nombre);
    

    De esta forma scanf no se detendrá en el primer espacio sino en el salto de línea. La explicación a esa entrada es la siguiente:

    • %[^n] indica a scanf que debe leer hasta encontrar un salto de línea
    • %*c esta opción lee un único caracter (el salto de linea). El asterisco indica a scanf que debe descartar dicho caracter.
  • Si tu idea es descartar la segunda palabra, tendrás que vaciar el buffer de entrada a mano. No hay una forma estándar de realizar esto, pero una de las más utilizadas es la siguiente:

      int c;
      while ((c = getchar()) != 'n' && c != EOF);
    

    Introduce estas lineas después de tu scanf y así descartarás todo lo que haya en el buffer de entrada hasta el primer salto de línea (que también se descartará)

Answered by eferion on November 22, 2021

Cambia la lectura mediante scanf por una lectura mediante fgets:

printf("Nombre: ");
fgets(nombre, 30, stdin);
printf("Apellido: ");
fgets(apellido, 30, stdin);

Ten en cuenta que también te leerá el carácter de final de salto de línea.

Answered by PaperBirdMaster on November 22, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP